rwb*_*rwb 4 windows 64-bit winapi openfiledialog
我有以下代码,我用来使用Win32 API打开文件打开对话框.它在32位工作正常,但在64位(在DLL中)使用时失败.我究竟做错了什么?
char Filestring[256];
Filter = "OBJ files\0*.obj\0\0";
char* returnstring = NULL;
OPENFILENAME opf;
opf.hwndOwner = mainHWND;
opf.lpstrFilter = Filter;
opf.lpstrCustomFilter = 0;
opf.nMaxCustFilter = 0L;
opf.nFilterIndex = 1L;
opf.lpstrFile = Filestring;
opf.lpstrFile[0] = '\0';
opf.nMaxFile = 256;
opf.lpstrFileTitle = 0;
opf.nMaxFileTitle=50;
opf.lpstrInitialDir = Path;
opf.lpstrTitle = "Open Obj File";
opf.nFileOffset = 0;
opf.nFileExtension = 0;
opf.lpstrDefExt = "*.*";
opf.lpfnHook = NULL;
opf.lCustData = 0;
opf.Flags = (OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT) & ~OFN_ALLOWMULTISELECT;
opf.lStructSize = sizeof(OPENFILENAME);
if(GetOpenFileName(&opf))
{
returnstring = opf.lpstrFile;
if (returnstring) {
result = returnstring;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:失败,我的意思是打开文件对话框没有显示.代码仍返回零,没有任何错误.
编辑2:我已调用CommDlgExtendedError()并返回1.从MSDN引用,是否表示对话框具有无效的lStructSize?我检查了sizeof(OPENFILENAME)它,它返回140个字节.
更新:在我的项目设置中,在代码生成下,"结构成员对齐"设置为4字节(/ Zp4).我将其更改为默认值并且神奇地工作了.有关详细信息,请查看下面的答案及其评论.
您没有初始化lpTemplateName,因此它包含随机堆栈噪声.这反过来将导致'hInstance`成为也包含堆栈噪声的引用.
调用这样的函数时,首先应该将结构清零,只填写非零的字段.像这样的东西:
OPENFILENAME opf={0};
opf.lStructSize = sizeof(OPENFILENAME);
opf.hwndOwner = mainHWND;
opf.lpstrFilter = Filter;
opf.nFilterIndex = 1L;
opf.lpstrFile = Filestring;
opf.lpstrFile[0] = '\0';
opf.nMaxFile = 256;
opf.lpstrInitialDir = Path;
opf.lpstrTitle = "Open Obj File";
opf.lpstrDefExt = "*.*";
opf.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
Run Code Online (Sandbox Code Playgroud)
没有必要OFN_ALLOWMULTISELECT明确排除,因为你没有首先包括它!
编辑
您在评论中声明这不起作用.打电话CommDlgExtendedError是一个好主意,应该告诉你它失败的原因.
你也可以尝试运行最小可能GetOpenFileName,这是:
char Filestring[MAX_PATH] = "\0";
OPENFILENAME opf={0};
opf.lStructSize = sizeof(OPENFILENAME);
opf.lpstrFile = Filestring;
opf.nMaxFile = MAX_PATH;
GetOpenFileName(&opf);
Run Code Online (Sandbox Code Playgroud)