为什么弹不出OpenFile对话框?

jyg 2000-08-09 11:05:00
因为不想使用OpenDialog控件,拿GetOpenFileName()来代替,结果在Win2K下没问题,但是在Win98下就是不能正常执行这个API.
下面是个简单的测试程序,各位帮忙看看问题出在哪里。

在form上放一个button,按下后执行这段代码:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
OPENFILENAME ofnDlg;

char szName[MAX_PATH];
char szFileTitle[MAX_PATH] = {""};
char OpenFilter[] = "Programs\0*.bat;*.exe;*.pif;*.com\0All Files (*.*)\0*.*\0";
ZeroMemory(szName, sizeof(szName));

// Setup open dialog box
ofnDlg.lStructSize = sizeof(ofnDlg);
ofnDlg.hwndOwner = Handle;
ofnDlg.hInstance = HInstance;
ofnDlg.lpstrFilter = (LPSTR) OpenFilter;
ofnDlg.lpstrCustomFilter = NULL;
ofnDlg.nMaxCustFilter = 0;
ofnDlg.nFilterIndex = 1;
ofnDlg.lpstrFile = (LPSTR) szName;
ofnDlg.nMaxFile = sizeof(szName);
ofnDlg.lpstrFileTitle = szFileTitle;
ofnDlg.nMaxFileTitle = sizeof(szFileTitle);
ofnDlg.lpstrInitialDir = "C:\\";
ofnDlg.lpstrTitle = "OpenFile";
ofnDlg.Flags = OFN_FILEMUSTEXIST and OFN_PATHMUSTEXIST and OFN_HIDEREADONLY and OFN_EXPLORER;
ofnDlg.nFileOffset = 0;
ofnDlg.nFileExtension = 0;
ofnDlg.lpstrDefExt = "*";
ofnDlg.lCustData = 0;

GetOpenFileName(&ofnDlg);
}

噢,对了,以前同样代码在CB4下好好的,现在升级到CB5反而不行了。
我还用VC试了试,没有问题呀,98和2K都很正常。
另外,就是在2K下,builder和vc调出的对话框也不一样。他们只是handle和instance调用不同,这有关系吗?
...全文
126 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyg 2000-08-11
  • 打赏
  • 举报
回复
多谢Dinkar,这回是搞清楚了.
jyg 2000-08-10
  • 打赏
  • 举报
回复
是改成76就行了.
但要说是commdlg.dll版本的问题,我就不明白了.同在2K下同一commdlg.dll不存在版本问题呀!
「已注销」 2000-08-10
  • 打赏
  • 举报
回复
看看Commdlg.h里面的OPENFILENAME结构的定义就知道了啊,

#if (_WIN32_WINNT >= 0x0500)//编译系统把我们的win98识别错了,所以多出了12个字节。:)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
「已注销」 2000-08-09
  • 打赏
  • 举报
回复
是COMMDLG.DLL版本的问题,改成ofnTemp.lStructSize=76;就可以了。;)
jyg 2000-08-09
  • 打赏
  • 举报
回复
嗨,Dinkar,你好,我运行了一下你的代码:

Errval在Win98下得到的值是1,也就是说为CDERR_STRUCTSIZE.
我分别在Win98和Win2K下跟踪,ofnTemp.lStructSize都等于88.
在Win2k下我又查了VC中sizeof(OPENFILENAME)竟然等于76.
真是奇怪了,谁能帮忙解释一下?
「已注销」 2000-08-09
  • 打赏
  • 举报
回复
void APPFileOpen(HWND hWnd,LPSTR Title)
{
OPENFILENAME ofnTemp;
DWORD Errval; // Error value
char buf[5]; // Error buffer
char Errstr[50]="GetOpenFileName returned Error #";
char szTemp[]="All Files (*.*)\0*.*\0Text Files (*.txt)\0*.txt\0";
ofnTemp.lStructSize=sizeof(OPENFILENAME);
ofnTemp.hwndOwner=hWnd; // An invalid hWnd causes non-modality
ofnTemp.hInstance=0;
ofnTemp.lpstrFilter=(LPSTR)szTemp; // See previous note concerning string
ofnTemp.lpstrCustomFilter=NULL;
ofnTemp.nMaxCustFilter=0;
ofnTemp.nFilterIndex=1;
ofnTemp.lpstrFile=(LPSTR)szName; // Stores the result in this variable
ofnTemp.nMaxFile=sizeof(szName);
ofnTemp.lpstrFileTitle=NULL;
ofnTemp.nMaxFileTitle=0;
ofnTemp.lpstrInitialDir=NULL;
ofnTemp.lpstrTitle=Title; // Title for dialog
ofnTemp.Flags=/*OFN_FILEMUSTEXIST|*/OFN_HIDEREADONLY|OFN_PATHMUSTEXIST;
ofnTemp.nFileOffset=0;
ofnTemp.nFileExtension=0;
ofnTemp.lpstrDefExt="";
ofnTemp.lCustData=0L;
ofnTemp.lpfnHook=NULL;
ofnTemp.lpTemplateName=NULL;
if(GetOpenFileName(&ofnTemp)!=TRUE){
Errval=CommDlgExtendedError();
if(Errval!=0){
sprintf(buf,"%ld",Errval);
strcat(Errstr,buf);
MessageBox(hWnd,Errstr,"Warinng",MB_OK|MB_ICONSTOP);}}
InvalidateRect(hWnd,NULL,TRUE); // Repaint to display the new name
}

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧