3

我试图在托管 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()显示加载dllcode.dll失败是由于The specified module could not be found.

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

4

2 回答 2

4

我刚刚发现为什么从我的 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

希望这可以帮助。相当初学者的问题,我怀疑......

于 2009-04-16T18:25:04.167 回答
0

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

于 2009-04-16T18:01:34.770 回答