GetOpenFileName在64位失败,但在32位工作?

GetOpenFileName在64位失败,但在32位工作?,第1张

概述GetOpenFileName在64位失败,但在32位工作? @H_403_0@我有以下代码,我使用Win32 API打开文件打开对话框。 它在32位工作正常,但在64位(在DLL中)使用时失败。 我究竟做错了什么?

@H_403_0@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; } }

@H_403_0@编辑:通过失败,我的意思是打开文件对话框不显示。 该代码仍然返回零没有任何错误。

@H_403_0@编辑2:我已经调用CommDlgExtendedError()并返回1.从MSDN参考,是否意味着对话框具有无效的lStructSize? 我已经检查了sizeof(OPENfilename) ,它返回了140个字节。

@H_403_0@更新:在我的项目设置,在代码生成“结构成员alignment”设置为4字节(/ Zp4)。 我改变了这个默认,它神奇地工作。 查找下面的答案和他们的评论以获取更多信息。

@H_403_0@当ZMQ_FD option_val的本地地址传递时,zmq_getsockopt在windows x64上返回EINVAL

@H_403_0@在windows上,wso2 esb部署失败

@H_403_0@检测一个32位进程是否在linux下的64位环境中运行

@H_403_0@winscard.dll在.NET应用程序中的ERROR_INVALID_HANDLE

@H_403_0@在windows 64位上使用Delphi的libusb?

@H_403_0@虚拟服务器/ EC2上的32位和64位 *** 作系统

@H_403_0@当我尝试在linux上使用64位perl的DBD :: Advantage时,为什么会出现“Error 6060”?

@H_403_0@在fork之后重新创build死线程

@H_403_0@如何运行windows 8的基本版本安装的windows Phone 8模拟器?

@H_403_0@不能在64位linux系统上用mmap / malloc / open等创build大于2GB的文件

@H_403_0@您不初始化lpTemplatename ,因此它包含随机堆栈噪声。 这反过来会导致“hInstance”作为也包含堆栈噪声的引用。

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

@H_403_0@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;

@H_403_0@没有必要明确排除OFN_ALLOWMulTISELECT因为你并没有把它放在第一位!

@H_403_0@编辑

@H_403_0@您在评论中声明这不起作用。 调用CommDlgExtendedError是一个好主意,应该告诉你为什么失败。

@H_403_0@你也可以尝试运行尽可能小的Getopenfilename ,它是这样的:

@H_403_0@char filestring[MAX_PATH] = ""; OPENfilename opf={0}; opf.lStructSize = sizeof(OPENfilename); opf.lpstrfile = filestring; opf.nMaxfile = MAX_PATH; Getopenfilename(&opf);

@H_403_0@要了解更多信息,请调用CommDlgExtendedError获取错误代码。 除此之外,我将初始化结构的所有成员为0

@H_403_0@ZeroMemory(&opf,sizeof(opf));

@H_403_0@由于文件打开对话框实际上是一个COM组件,因此可能需要检查您的线程单元状态在64位下是否不同。

@H_403_0@if( RPC_E_CHANGED_MODE == CoInitialize(NulL) ) ASSERT(FALSE); // MTA Apartment found CoUnitialize()

@H_403_0@你的,阿洛伊斯·克劳斯

@H_403_0@我有同样的问题和一个部分的解决方案:简单的下面的简单的例子(建议abobe)不工作在x64模式。 +我将complIE选项“struct Member Alignment”从1byte / Zp1更改为默认解决了这个问题(通过引入其他的!!!)

@H_403_0@char filestring [MAX_PATH] =“ 0”; OPENfilename opf = {0}; opf.lStructSize = sizeof(OPENfilename); opf.lpstrfile = filestring; opf.nMaxfile = MAX_PATH; Getopenfilename(OPF);

@H_403_0@作为Microsoft Office 2010 64位的说明,我们放弃了使用内部包装,因为结构变成了140字节,我们不知道如何更改对齐方式。

@H_403_0@Application.Getopenfilename(fileFilter,FilterIndex,Title,buttonText,MultiSelect)和Application.GetSaveAsfilename(Initialfilename,fileFilter,FilterIndex,Title,buttonText)

@H_403_0@http://msdn.microsoft.com/en-us/library/ff834966.aspx

@H_403_0@http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel._application.getopenfilename.aspx

@H_403_0@毋庸置疑,我们认为所有在Excel中具有相当大的应用程序的个人应该开始考虑其他选项,因为在多个客户端和平台上维护未来的版本可能只是……疯狂!

@H_403_0@包含头文件之前,我已经设法正确地设置了包装,从而解决了这个问题。 这样,为了这个功能的目的,我们使用了“默认”的16字节对齐方式,但是不需要改变我们程序其余部分的打包对齐方式:

@H_403_0@#ifdef _WIN64 #pragma pack( push ) #pragma pack( 16 ) #include "Commdlg.h" #pragma pack( pop ) #else #include "Commdlg.h" #endif // _WIN64

总结

以上是内存溢出为你收集整理的GetOpenFileName在64位失败,但在32位工作?全部内容,希望文章能够帮你解决GetOpenFileName在64位失败,但在32位工作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1284253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存