【问题标题】:Inexplicable error 193 with LoadLibrary of a C++ DLL using \clr使用 \clr 的 C++ DLL 的 LoadLibrary 出现莫名其妙的错误 193
【发布时间】: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


【解决方案1】:

感谢您提供链接 Patrice Pezillier。 使用您的链接解决了这个问题:boost 是罪魁祸首。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2019-02-04
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多