【问题标题】:Loading Managed C++ DLL from plain C++ Program via LoadLibrary通过 LoadLibrary 从普通 C++ 程序加载托管 C++ DLL
【发布时间】:2009-04-16 17:54:19
【问题描述】:

我正在尝试在托管 C++ 和普通 C++ 工作之间进行简单的混合。我正在使用 Visual Studio 2005,但一直遇到问题。这是我的设置。

首先,我有一个从代码构建的简单 DLL

#using "mscorlib.dll"

#include "windows.h"

__declspec(dllexport)
void sayHello()
{
    OutputDebugStringA( "Hello from managed code!" );
}

我在命令行上将其编译为 DLL,使用

cl /CLR /LD dllcode.cpp

接下来,我有一个简单的程序,仅包含以下内容

#include <windows.h>
int main()
{
    HINSTANCE lib = LoadLibrary( "dllcode.dll" );
    if ( !lib ) {
        return 1;
    }
    return 0;
}

我用这个构建了一个应用程序

cl loader.cpp

所以我最终将dllcode.dllloader.exe 放在同一个目录中。尝试运行loader.exe 时,我总是得到返回码“1”。查看GetLastError()产生的错误代码显示由于The specified module could not be found.而导致加载dllcode.dll失败

有人知道为什么会这样吗?它是否与需要嵌入到 dllcode.dll 左右的清单有关?我在 dllcode.dll 上运行了依赖程序,但据我所知,它没有产生任何问题。

【问题讨论】:

    标签: c++ dll loadlibrary


    【解决方案1】:

    我刚刚发现为什么从我的 vanilla C++ 程序加载托管 C++ DLL 不起作用。再次感谢 jdigital 为我提供了一个有用的工具:

    错误的根源是没有找到 MSVC8 运行时库。我认为是通过构建时生成的清单

    cl /CLR /LD dllcode.cpp
    

    已嵌入到 DLL 中。显然,它不是 - 所以加载程序未能找到适当的 MSVCR80.dll 副本。

    我通过在 DLL 构建例程中添加第二步解决了这个问题:

    cl /CLR /LD dllcode.cpp
    mt -manifest dllcode.dll.manifest -outputresource:dllcode.dll;2
    

    希望这会有所帮助。相当初学者的问题,我怀疑......

    【讨论】:

      【解决方案2】:

      您可以尝试使用 filemon 来查看 LoadLibrary 尝试加载的内容。

      【讨论】:

      • 好主意;似乎 filemon 已被 procmon 取代。使用后者,运行演示程序会产生 1076 个事件。不幸的是,我在那里看不到任何错误——至少所有的 LoadImage 调用都成功了。你有什么建议吗?
      • 这就是为什么我仍然使用 FileMon,即使它已被取代; procmon 需要更多的工作来设置,并且在配置过滤器时更容易出错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多