2009-04-16 7 views
2

J'essaie d'obtenir un mélange simple entre le C++ managé et le C++ normal. J'utilise Visual Studio 2005 mais continue à rencontrer un problème. Voici ma configuration.Chargement de la DLL C++ managée à partir du programme C++ ordinaire via LoadLibrary

D'abord, j'ai une DLL simple, construit à partir du code

#using "mscorlib.dll" 

#include "windows.h" 

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

Je compile cela sur la ligne de commande à une DLL à l'aide

cl /CLR /LD dllcode.cpp 

Ensuite, j'ai un programme simple composé de rien de plus que

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

Je construis une application de ce en utilisant

cl loader.cpp 

Alors je me retrouve avec dllcode.dll et loader.exe dans le même répertoire. Lorsque j'essaie de lancer loader.exe, j'obtiens toujours le code retour '1'. En regardant le code d'erreur produit par GetLastError() montre que le chargement dllcode.dll échoué en raison de The specified module could not be found.

Quelqu'un sait pourquoi cela pourrait-il être? Cela a-t-il quelque chose à voir avec les manifestes qui doivent être intégrés dans dllcode.dll? J'ai exécuté le programme depends sur dllcode.dll mais il n'a pas donné de problèmes autant que je pourrais dire.

Répondre

3

Je viens de découvrir pourquoi le chargement de la DLL C++ managée à partir de mon programme C++ vanilla ne fonctionnait pas. Merci encore une fois à jdigital pour m'avoir indiqué un outil utile:

La source de l'erreur était que la bibliothèque d'exécution MSVC8 était introuvable. Je pensais que le manifeste qui est généré lors de la construction via

cl /CLR /LD dllcode.cpp 

est déjà intégré dans la DLL. Apparemment, ce n'est pas le cas. Le chargeur n'a donc pas pu trouver la copie MSVCR80.dll appropriée.

Je résolu ce problème en ajoutant une deuxième étape à la routine de construction DLL:

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

Hope this helps. Tout à fait un problème de débutant, je suspecte ...

0

Vous pouvez essayer d'utiliser filemon pour voir ce que LoadLibrary essaie de charger.

+0

Bonne idée; il semble que Filemon a été remplacé par Procmon. En utilisant ce dernier, l'exécution du programme de démonstration a donné lieu à 1076 événements. Malheureusement, je ne pouvais pas voir d'erreurs là-bas - tous les appels LoadImage ont réussi, au moins. Avez-vous une suggestion à faire? –

+0

C'est pourquoi j'utilise toujours FileMon même s'il a été remplacé; Procmon prend plus de travail à mettre en place et il est plus facile de faire des erreurs lors de la configuration des filtres. – jdigital

Questions connexes