Загрузка управляемой C ++ DLL из простой программы C ++ через LoadLibrary - PullRequest
2 голосов
/ 16 апреля 2009

Я пытаюсь получить простую смесь между управляемым 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.dll и loader.exe в одном каталоге. При попытке запустить loader.exe я всегда получаю код возврата '1'. Поиск кода ошибки, выданного GetLastError(), показывает, что загрузка dllcode.dll не удалась из-за The specified module could not be found.

Кто-нибудь знает, почему это может быть? Это как-то связано с манифестами, которые нужно встроить в dllcode.dll или около того? Я запустил зависимую программу на dllcode.dll, но, насколько я могу судить, проблем не возникло.

Ответы [ 2 ]

3 голосов
/ 16 апреля 2009

Я только что узнал, почему загрузка Managed C ++ DLL из моей vanilla C ++ программы не работает. Еще раз спасибо 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

Надеюсь, это поможет. Я подозреваю, что это проблема для начинающих ...

0 голосов
/ 16 апреля 2009

Вы можете попробовать использовать filemon , чтобы увидеть, что LoadLibrary пытается загрузить.

...