如何让DLL在不同的Windows版本上运行?
我正在编译自己的DLL,包含几个.o文件.其中一个.o文件具有调用仅在
Windows 7上支持的SHLoadLibraryFromItem的函数.除非使用DLL的应用程序在Windows 7上运行,否则永远不会调用该函数.(是的,我确定.)
但是,在较旧版本的Windows(例如,XP)上运行应用程序时,整个应用程序在启动时崩溃,并显示错误“无法找到指定的过程”.虽然错误没有指定找不到哪个过程,但如果我注释掉对SHLoadLibraryFromItem的调用,那么一切正常. 问题: >为什么Windows试图找到SHLoadLibraryFromItem,即使它没有在XP上调用? 我能想到的唯一方法就是: >使用LoadLibrary加载SHLoadLibraryFromItem所在的Windows DLL,并使用GetProcAddress手动获取地址到指向函数的指针,并使用指针调用SHLoadLibraryFromItem? 还有其他想法吗?我真的更喜欢上面提到的某种懒惰绑定. 更新 请仔细阅读我实际操作的内容.我在第一段中明确指出,除非我知道应用程序在WINDOWS 7上正在运行,否则不会调用SHLoadLibraryFromItem. 应用程序仅在加载DLL时崩溃.
链接器将模块中的引用嵌入到所使用的每个API函数中.当Windows加载程序加载可执行文件及其模块时,它需要将代码中的所有调用“挂钩”到实际加载API函数的内存中的位置.如果找不到它们,它将无法继续.
使用LoadLibrary和GetProcAddress是解决此问题的“标准”方法. 使用两个DLL对您没有帮助,因为只要其中一个无法加载您的应用程序仍然无法启动.您可以通过使用延迟加载来解决这个问题,将所有依赖于新O / S的代码放在一个单独的模块中,并将所有对该模块的调用包装在Win32 SEH异常处理程序中(延迟加载时会出现SEH异常)无法加载模块).优点是你可以使用“自动”链接而不需要乱七八糟的函数指针,但异常处理可能非常糟糕. This article解释了一下,并给出了一些如何整齐地包装它的例子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何从Windows QML应用程序中删除边框
- windows-server-2003 – Windows Server 2003 – 不活动注销
- 配置code::blocks的glut环境
- 从Windows Server 2008 R2上的软件RAID 1引导
- windows-server-2008 – 为什么我不能从win2008 NAT后面连接
- windows – 在PowerShell函数中不起作用的字符串比较 – 我
- windows-server-2008-r2 – vSphere中的Windows Server gue
- windows-8 – 选择Windows运行时组件与可移植代码库
- 有关使用Microsoft OLE DB Provider for Jet 4.0的EXCEL中S
- 安装软件的时候,计算机用户名是中文名的解决办法