Загрузка управляемой библиотеки DLL C ++ из простой программы C ++ через LoadLibrary

Я пытаюсь получить простую смесь между управляемым 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, но, насколько я мог судить, это не дало никаких проблем.


person Frerich Raabe    schedule 16.04.2009    source источник


Ответы (2)


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

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

person Frerich Raabe    schedule 16.04.2009

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

person jdigital    schedule 16.04.2009
comment
Хорошая идея; похоже, что filemon был заменен procmon. Используя последнее, при запуске демонстрационной программы было получено 1076 событий. К сожалению, я не увидел там никаких ошибок - по крайней мере, все вызовы LoadImage прошли успешно. Может быть, у вас есть предложения, на что обращать внимание? - person Frerich Raabe; 16.04.2009
comment
Вот почему я все еще использую FileMon, хотя он был заменен; Для настройки procmon требуется больше работы, и при настройке фильтров легче делать ошибки. - person jdigital; 17.04.2009