能力值:
(RANK:350 )
2 楼
ofn结构必须初始化为0,然后再对相关字段赋值。
能力值:
(RANK:410 )
3 楼
在调用GetOpenFileName函数前,必须对ofn结构初始化。
.data
ofn OPENFILENAME <>
lpszFileNameBuff db 200 dup(0)
lpStrFilter db 'dll Files(*.dll)',0,'*.dll',0,'exe files(*.exe)',0,'*.exe',0,'dll&exe Files(*.dll;*.exe)',0,'*.dll;*.exe',0,'all Files(*.*)',0,'*.*',0,0
lpStrDefExt db 'dll',0
;------------------------------------------------
.elseif eax==WM_COMMAND
invoke RtlZeroMemory,addr ofn,sizeof ofn
invoke RtlZeroMemory,addr lpStrFile,sizeof lpStrFile
invoke RtlZeroMemory,addr lpStrFileTitle,sizeof lpStrFileTitle
mov eax,wParam
.if ax==DLG_BUTTON_BROWSE1
mov eax,sizeof lpStrFile
invoke _MyGetOpenFileName,hWnd,addr lpStrFile,addr lpStrFileTitle,eax
.if eax
mov eax,ofn.lpstrFile
invoke SetDlgItemText,hWnd,DLG_EDIT1,eax
.endif
;---------------------------------------------
;对ofn结构初始化函数
_MyGetOpenFileName proc hWnd:HWND,strFile:DWORD,strFileTitle:DWORD,lpStrFileSzie:DWORD
push hWnd
pop ofn.hwndOwner
push strFile
pop ofn.lpstrFile
push strFileTitle
pop ofn.lpstrFileTitle
mov ofn.Flags,2004h
mov ofn.lStructSize,sizeof OPENFILENAME
push lpStrFileSzie
pop ofn.nMaxFile
mov ofn.lpstrFilter,offset lpStrFilter
mov ofn.lpstrDefExt,offset lpStrDefExt
invoke GetOpenFileName,addr ofn
ret
_MyGetOpenFileName endp
能力值:
( LV2,RANK:10 )
4 楼
又遇到了新的问题,当GetOpenFileName(ofn);返回的时候,
ofn.lpstrFile得到的字符串是空的,看了刚才给的汇编
好象是没有对ofn.lpstrFile初始化。
看了Delphi的ofn定义,如下:
但我却不知道Delphi对应的地方
lpszFileNameBuff db 200 dup(0)该怎么写?
~~~~~~~~~~~~~~~~~~~
这句话用delphi该如何写呢?
tagOFNA = packed record
lStructSize: DWORD;
hWndOwner: HWND;
hInstance: HINST;
lpstrFilter: PAnsiChar;
lpstrCustomFilter: PAnsiChar;
nMaxCustFilter: DWORD;
nFilterIndex: DWORD;
lpstrFile: PAnsiChar;
nMaxFile: DWORD;
lpstrFileTitle: PAnsiChar;
nMaxFileTitle: DWORD;
lpstrInitialDir: PAnsiChar;
lpstrTitle: PAnsiChar;
Flags: DWORD;
nFileOffset: Word;
nFileExtension: Word;
lpstrDefExt: PAnsiChar;
lCustData: LPARAM;
lpfnHook: function(Wnd: HWND;
Msg: UINT;
wParam: WPARAM;
lParam: LPARAM):UINT stdcall;
lpTemplateName: PAnsiChar;
end;
能力值:
(RANK:410 )
5 楼
lpszFileNameBuff:Array[0.200] of Char;
下面三句是对变量ofn、lpStrFile、lpStrFileTitle初始为0。
invoke RtlZeroMemory,addr ofn,sizeof ofn
invoke RtlZeroMemory,addr lpStrFile,sizeof lpStrFile
invoke RtlZeroMemory,addr lpStrFileTitle,sizeof lpStrFileTitle
能力值:
( LV2,RANK:10 )
6 楼
var
ofn : tagOFN;
szFileName : Array[0..255] of Char;
......
ZeroMemory(@szFileName,sizeof(szFileName));
ofn.lpstrFile := szFileName;
GetOpenFileName(ofn);
// SetDlgItemText(Wnd, DLG_EDIT5, 'Hello');
SetDlgItemText(Wnd,DLG_EDIT5,szFileName);
我这样写有什么问题吗?DLG_EDIT5可以显示Hello,
却无法显示出文件路径名。
我哪里错了?
能力值:
( LV2,RANK:10 )
7 楼
我对GetOpenFileName函数做了以下的测试,点确定按扭后,
在控件上面始终显示的是World.也就是说GetOpenFileName(ofn)
始终返回的是false
扩张lpstrFile的长度也不行,可能传的ofn参数中还有什么参数有错误
if (GetOpenFileName(ofn)) then
SetDlgItemText(Wnd, DLG_EDIT5, 'Hello')
else
SetDlgItemText(Wnd, DLG_EDIT5, 'World');
通过这个线索,终于找到出错的地方,原来ofn结构没放对
能力值:
(RANK:410 )
8 楼
Procedure OpenFileName();
var lpszBuff:Array[0..255] of Char;
ofn:TOPENFILENAMEA ;
lpstrFilter:PChar;
begin
lpstrFilter := 'all File(*.*)'+Char(0)+'*.*'+Char(0);
ZeroMemory(@lpszBuff,sizeof(lpszBuff));
ZeroMemory(@ofn,sizeof(TOPENFILENAMEA));
ofn.lStructSize := sizeof(TOPENFILENAMEA)-12;
ofn.lpstrFilter := lpstrFilter;
ofn.lpstrFile := lpszBuff;
ofn.nMaxFile := sizeof(lpszBuff);
ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
GetOpenFileName(ofn);
end;