【发布时间】:2014-07-23 09:06:20
【问题描述】:
我们有一个使用 Boost 1.54.0 和 QT 4.8.6 用 C++ 开发的用户界面。 该接口可以调用计算模块。每个模块必须实现一个(非纯)抽象类,并链接到接口编译期间生成的给定 .lib。启动界面后,我们指出使用QLibrary加载的模块dll的路径。
一切都与原生 C++ 模块完美配合,但最近我们开始使用 .NET 3.5 (C#) 开发新模块。我们希望接口可以调用这个模块,所以我们决定使用 \clr 创建一个中间 c++ 项目:这个项目实现了抽象类,并且可以调用托管的 .NET 代码,这要归功于 \clr 模式。
现在我们有一个大问题:我们无法正确加载中间 C++ 问题。我们尝试使用 kernel32 方法 LoadLibrary,得到错误代码 193 (ERROR_BAD_EXE_FORMAT)。这是非常令人惊讶的,因为所有项目都是针对 Win32/x86 编译的,并且计算机使用的是 Windows Vista 32 位。
dependancy walker 一切正常:
我们使用了垃圾箱,但一切似乎都很正常:
Microsoft (R) COFF/PE Dumper 版本 9.00.30729.01 版权所有 (C) 微软公司。保留所有权利。
Lien.dll 文件转储
找到PE签名
文件类型:DLL
文件头值 14C机(x86)
6 number of sections 53CF72B5 time date stamp Wed Jul 23 10:30:45 2014 0 file pointer to symbol table 0 number of symbols E0 size of optional header 2102 characteristics Executable 32 bit word machine DLL
【问题讨论】:
-
首先,运行 32 位 Windows 的计算机能够构建 64 位模块。因此,操作系统的位数无关紧要。其次,编写一个简单的
main程序,除了在遇到问题的模块上调用“LoadLibrary”之外什么都不做。如果你不能让它工作,那么就在那个简单的程序上工作,直到你能让它工作为止。 -
使用 BOOST_THREAD_DYN_LINK => stackoverflow.com/questions/9353128/loadlibrary-193
-
错误码不一定是指你的 DLL,它也可以适用于任何需要加载的依赖DLL。如果您使用 LoadLibrary() 来加载混合模式的 .NET 程序集,这将变得非常棘手,您对托管代码中的任何意外都视而不见。就像没有安装所需的 .NET Framework 版本一样,也报告为错误 193。如果您使用错误的工具链,它比 3.5 btw 更高版本的可能性非零,请使用 ildasm.exe 进行查看
标签: c++ boost clr loadlibrary