【发布时间】:2011-02-13 05:46:32
【问题描述】:
我有以下代码,我使用 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;
}
}
编辑:通过失败,我的意思是打开文件对话框没有出现。代码仍然返回零,没有任何错误。
编辑 2:我调用了 CommDlgExtendedError() 并返回 1。从 MSDN 参考中,这是否意味着对话框的 lStructSize 无效?我检查了sizeof(OPENFILENAME),它返回了 140 个字节。
更新:在我的项目设置中,在代码生成下,“结构成员对齐”设置为 4 字节 (/Zp4)。我将其更改为默认值,它神奇地起作用了。请在下面查找答案及其相关信息以获取更多信息。
【问题讨论】:
-
你是不是偶然调用了
Wow64DisableWow64FsRedirection函数(msdn.microsoft.com/en-us/library/aa365743.aspx)? -
我不这么认为。整个项目中没有这样的调用。
-
你能给我们更多的背景信息吗?这是一个什么样的项目?你在哪里使用 DLL?它是编译 到 64 位,还是只是在 64 位版本的 Windows 上运行 32 位 DLL?
-
您好,我使用的是 Windows 7 64 位,代码在编译的 32 位 DLL 中工作正常,但不适用于编译的 64 位 DLL。 DLL 是另一个主机应用程序的插件。如果有帮助,我将在 (/MT) 静态中编译它们。
-
您说“它失败了”,但事情不仅失败了,它们还会报告错误。请养成调查这些错误的习惯,并在发帖时将其全部包含在内。
标签: windows winapi 64-bit openfiledialog