Страница: 1 |
Страница: 1 |
Вопрос: GetOpenFileName с флагом OFN_ALLOWMULTISELECT
Добавлено: 21.07.06 07:09
Автор вопроса: ZagZag | ICQ: 295002202
Есть ли у кого пример как обработать данные полученные из функции GetOpenFileName с флагом OFN_ALLOWMULTISELECT, т.е. как разделить полученную строку (допустим в ListBox)
В принципе вроде все понятно, но только ничего не работает :)
В масмовских примерах рабочего кода не нашел (может плохо искал)
Вобщем надо показать диалог, и, вне зависимости сколько файлов пользователь выберет, добавить их в ЛистБокс
Ответы
Всего ответов: 3
Номер ответа: 1
Автор ответа:
JMP
Вопросов: 6
Ответов: 171
Профиль | | #1
Добавлено: 21.07.06 07:53
На старейшем языке (В инерпритации либери бэйсик please, не хохотать, на компе с которого я счас пишу 32Мб memory :D) это выглядит так:
z$ = CHR$(0)
struct ofn, _
lStructSize AS LONG, _
hwndOwner AS LONG, _
hInstance AS LONG, _
lpstrFilter$ AS PTR, _
lpstrCustomFilter$ AS PTR, _
nMaxCustFilter AS LONG, _
nFilterIndex AS LONG, _
lpstrFile$ AS PTR, _
nMaxFile AS LONG, _
lpstrFileTitle$ AS PTR, _
nMaxFileTitle AS LONG, _
lpstrInitialDir$ AS PTR, _
lpstrTitle$ AS PTR, _
flags AS LONG, _
nFileOffset AS WORD, _
nFileExtension AS WORD, _
lpstrDefExt$ AS PTR, _
lCustData AS LONG, _
lpfnHook AS LONG, _
lpTemplateName AS LONG
Filter$ = "Text files"+z$+"*.txt"+z$+"All files" + z$ + "*.*" + z$ + z$
ofn.lStructSize.struct = LEN(ofn.struct)
ofn.lpstrFilter$.struct = Filter$
ofn.nFilterIndex.struct = 1
ofn.lpstrFile$.struct = z$ + SPACE$(260) + z$
ofn.nMaxFile.struct = 260
ofn.lpstrFileTitle$.struct = SPACE$(260) + z$
ofn.nMaxFileTitle.struct = 260
ofn.lpstrInitialDir$.struct = DefaultDir$ + z$
ofn.lpstrTitle$.struct = "Open source file" + z$
OFN.EXPLORER=hexdec("80000" '--bring new style of selecting
ofn.flags.struct = _OFN_PATHMUSTEXIST or _OFN_FILEMUSTEXIST or OFN.EXPLORER _
OR _OFN_ALLOWMULTISELECT or _OFN_READONLY
ofn.lpstrDefExt$.struct = "txt" + z$
calldll #comdlg32, "GetOpenFileNameA",_
ofn AS struct,_
ok AS LONG
IF ok THEN
path$ = WinString(ofn.lpstrFile$.struct) '----get return string up to first null delimiter
PRINT "PATH=";path$
p = LEN(path$) + 1 '-----get offset for memory location of next name:
IF RIGHT$(path$, 1) <> "\" THEN path$ = path$ + "\"
file$ = WinString(ofn.lpstrFile$.struct+p) '----get string at new memory location
PRINT "File=";file$
WHILE file$<>""
PRINT "path+file="; path$+file$
SF$=path$+file$
p = p + LEN(file$) + 1 '------get offset for new memory location
file$ = WinString(ofn.lpstrFile$.struct + p) '--------get string at new memory location
WEND
END IF
Best regards,
Номер ответа: 2
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #2
Добавлено: 22.07.06 04:20
Спасибо за помощь.
Кстати я на масме код нашел вполне рабочий
вот
Источник: http://homepages.c3bb.com/krashnburn/Asm/General/GenericFileMapping.asm
.model flat,stdcall
option casemap:none
Main PROTO
INCLUDE c:\masm32\include\windows.inc
INCLUDE c:\masm32\include\user32.inc
INCLUDE c:\masm32\include\kernel32.inc
INCLUDE c:\masm32\include\comdlg32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\comdlg32.lib
.const
MAXSIZE equ 00FFFFh
.data
fintext db "The Decryptor Has Finished Decrypting",0
fincap db "Job Finished",0
AppName db "Generic Decryptor",0
FilterString db "All Files",0,"*.*",0,0
DecimalFormat db "%-lu",0
StringFormat db "%-hS",0
Problem db "Not Successfull",0
.data?
buffer db MAXSIZE dup(?)
FILENAME db 250 dup(?)
Path db 250 dup(?)
hMapFile HANDLE ?
hInstance HINSTANCE ?
hFileRead HANDLE ?
hFileWrite HANDLE ?
pMemory DWORD ?
hMemory DWORD ?
SizeWritten DWORD ?
MEMSIZE DWORD ?
ofn OPENFILENAME <>
FileSizeS LARGE_INTEGER <>
FileSizeU DWORD ?
PATHSIZE DWORD ?
NUMBEROFFILES DWORD ?
PASSES DWORD ?
FileNamePointer DWORD ?
PATHSIZEVAR DWORD ?
BLANK db 64 dup(?)
ENDOFFILENAME DWORD ?
.CODE
Program:
INVOKE GetModuleHandle,NULL
mov hInstance,EAX
INVOKE Main
INVOKE ExitProcess,NULL
ret
Main proc
mov ofn.lStructSize,SIZEOF ofn
push hInstance
pop ofn.hInstance
mov ofn.lpstrFilter,OFFSET FilterString
mov ofn.lpstrFile,OFFSET buffer
mov ofn.nMaxFile,MAXSIZE
mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or \
OFN_EXPLORER or OFN_HIDEREADONLY or OFN_ALLOWMULTISELECT
INVOKE GetOpenFileName,ADDR ofn
.IF eax!=TRUE
INVOKE MessageBox,NULL,ADDR Problem,ADDR AppName,MB_OK
ret
.ENDIF
mov eax,OFFSET buffer
mov ebp,OFFSET Path
mov ebx,1
move:
mov cl,BYTE PTR [EAX]
mov BYTE PTR [EBP],cl
.IF cl!=00
inc eax
inc ebp
inc ebx
jmp move
.ENDIF
mov PATHSIZE,EBX
mov PATHSIZEVAR,EBX
inc ebx
mov FileNamePointer,EBX
inc eax
xor ebx,EBX
xor ecx,ECX
COUNTFILES:
mov cl,BYTE PTR [EAX]
.IF cl==00
inc ebx
inc eax
mov cl,BYTE PTR [EAX]
.IF cl==00
mov NUMBEROFFILES,EBX
.IF EBX==01
xor EBP,EBP
mov eax,OFFSET Path
mov ebx,OFFSET FILENAME
looop:
.IF EBP>=250
mov eax,OFFSET FILENAME
EOFLOP:
mov cl,BYTE PTR [EAX]
.IF cl==00
mov ENDOFFILENAME,eax
jmp SINGLE
.ENDIF
inc eax
jmp EOFLOP
.ENDIF
mov CL,BYTE PTR [EAX]
mov BYTE PTR [EBX],CL
INC EAX
INC EBX
INC EBP
jmp looop
.ENDIF
mov PASSES,0
jmp WORK
.ENDIF
.ENDIF
inc eax
jmp COUNTFILES
WORK:
mov eax,NUMBEROFFILES
.IF PASSES>=EAX
JMP DONE
.ENDIF
add PASSES,1
mov eax,OFFSET Path
mov ebx,OFFSET FILENAME
xor EBP,EBP
looop2:
.IF EBP>=250
JMP loop2done
.ENDIF
mov CL,BYTE PTR [EAX]
mov BYTE PTR [EBX],CL
INC EAX
INC EBX
INC EBP
jmp looop2
loop2done:
xor ebp,ebp
mov eax,OFFSET FILENAME
add eax,PATHSIZE
dec eax
mov BYTE PTR [EAX],05ch
inc eax
mov ebx,OFFSET buffer
add ebx,PATHSIZEVAR
filenamesetup:
mov cl,BYTE PTR [EBX]
mov BYTE PTR [EAX],cl
.IF cl==00
inc ebp
add PATHSIZEVAR,ebp
mov ENDOFFILENAME,EAX
jmp SINGLE
.ENDIF
inc eax
inc ebx
inc ebp
jmp filenamesetup
SINGLE:
;INVOKE MessageBox,NULL,ADDR FILENAME,ADDR AppName,MB_OK
INVOKE CreateFile,ADDR FILENAME,GENERIC_READ or GENERIC_WRITE,NULL,NULL,\
OPEN_EXISTING,NULL,NULL
mov hFileRead,eax
INVOKE GetFileSize,hFileRead,addr FileSizeS
mov FileSizeU,eax
INVOKE GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,FileSizeU
mov hMemory,eax
INVOKE GlobalLock,hMemory
mov pMemory,eax
INVOKE ReadFile,hFileRead,pMemory,FileSizeU,addr SizeWritten,NULL
INVOKE CloseHandle,hFileRead
mov eax,pMemory
; insert the code that you want to use in here
; eax contains the allocatted memory address
;
;
;
;
;
mov EAX,ENDOFFILENAME
mov DWORD PTR [eax],4345442eh
INVOKE CreateFile,ADDR FILENAME,GENERIC_READ or GENERIC_WRITE,NULL,NULL,\
CREATE_ALWAYS,NULL,NULL
exit:
mov hFileRead,eax
INVOKE WriteFile,hFileRead,pMemory,FileSizeU,addr SizeWritten,NULL
INVOKE CloseHandle,hFileRead
INVOKE GlobalUnlock,pMemory
INVOKE GlobalFree,hMemory
.IF NUMBEROFFILES==01
JMP DONE
.ENDIF
JMP WORK
DONE:
invoke MessageBoxA,NULL,addr fintext,addr fincap,MB_OK
INVOKE PostQuitMessage,NULL
invoke ExitProcess,NULL
Main endp
END Program
Гугля - рулит!
PS
Зря, конечно, тему создал, но зато теперь он в сохранности здесь лежать будет
Номер ответа: 3
Автор ответа:
JMP
Вопросов: 6
Ответов: 171
Профиль | | #3
Добавлено: 22.07.06 08:39
Совсем не зря, наверняка кто-нибудь будет нуждаться в этом, и не раз.
Best regards,