加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – GetOpenFileName在64位失败,但在32Bit中工作?

发布时间:2020-12-14 05:46:17 所属栏目:Windows 来源:网络整理
导读:我有以下代码,我用来使用Win32 API打开文件打开对话框.它在32位工作正常,但在64位(在DLL中)使用时失败.我究竟做错了什么? char Filestring[256];Filter = "OBJ files*.obj";char* returnstring = NULL;OPENFILENAME opf;opf.hwndOwner = mainHWND;opf
我有以下代码,我用来使用Win32 API打开文件打开对话框.它在32位工作正常,但在64位(在DLL中)使用时失败.我究竟做错了什么?

char Filestring[256];
Filter = "OBJ files*.obj";
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] = '';
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).我将其更改为默认值并且神奇地工作了.有关详细信息,请查看下面的答案及其评论.

解决方法

您没有初始化lpTemplateName,因此它包含随机堆栈噪声.这反过来将导致’hInstance`成为也包含堆栈噪声的引用.

调用这样的函数时,首先应该将结构清零,只填写非零的字段.像这样的东西:

OPENFILENAME opf={0};
opf.lStructSize = sizeof(OPENFILENAME);
opf.hwndOwner = mainHWND;
opf.lpstrFilter = Filter;
opf.nFilterIndex = 1L;
opf.lpstrFile = Filestring;
opf.lpstrFile[0] = '';
opf.nMaxFile = 256;
opf.lpstrInitialDir = Path;
opf.lpstrTitle = "Open Obj File";
opf.lpstrDefExt = "*.*";
opf.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;

没有必要明确排除OFN_ALLOWMULTISELECT,因为你没有首先包含它!

编辑

您在评论中声明这不起作用.调用CommDlgExtendedError是一个好主意,应该告诉你它失败的原因.

您还可以尝试运行最小可能的GetOpenFileName,这是:

char Filestring[MAX_PATH] = "";
OPENFILENAME opf={0};
opf.lStructSize = sizeof(OPENFILENAME);
opf.lpstrFile = Filestring;
opf.nMaxFile = MAX_PATH;
GetOpenFileName(&opf);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读