2010-04-08 5 views
3

J'ai créé une DLL avec une fonction nommée "render()" et je veux la charger dynamiquement dans mon application, mais GetProcAddress ne la trouve pas. Voici la .h DLL:GetProcAddress ne trouve pas mes fonctions

#ifdef D3D_API_EXPORTS 
#define D3D_API_API __declspec(dllexport) 
#else 
#define D3D_API_API __declspec(dllimport) 
#endif 

D3D_API_API void render(); 

Et voici DLL Cpp:

#include "stdafx.h" 
#include "D3D_API.h" 
#include <iostream> 

D3D_API_API void render() 
{ 
    std::cout << "method called." << std::endl; 
} 

Voici l'application qui tente d'utiliser cette fonction:

#include "stdafx.h" 
#include <windows.h> 
#include <iostream> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HINSTANCE myDLL = LoadLibrary(L"D3D_API.dll"); 

    if (myDLL == NULL) { 
     std::cerr << "Loading of D3D_API.dll failed!" << std::endl; 
    } 

    typedef void (WINAPI *render_t)(); 

    render_t render = (render_t)GetProcAddress(myDLL, "render"); 

    if (render == NULL) { 
     std::cerr << "render() not found in .dll!" << std::endl; 
    } 
    return 0; 
} 

Mon but est de faire une 3D moteur qui prend en charge à la fois D3D et OpenGL via leurs propres .DLL en utilisant une API unifiée. J'ai regardé le .dll dans le bloc-notes et il y avait une chaîne "render".

Répondre

9

La fonction que vous exportez est traitée comme une fonction C++ (en raison de l'extension de fichier * .cpp) et C++ name mangling est utilisé pour décorer le nom de la fonction exportée. Si vous utilisez l'outil Dependency Walker de Microsoft pour inspecter votre DLL créée, vous verrez le nom complet des fonctions. Vous pouvez soit utiliser ce nom décoré dans votre code d'importation, soit forcer le compilateur à exporter votre fonction dans le style C, c'est-à-dire dans sa forme non décorée attendue par votre code d'importation actuel.

Vous pouvez demander au compilateur de le faire en ajoutant extern "C" à la signature de vos fonctions. Quelque chose comme ceci:

extern "C" D3D_API_API void render(); 

Maintenant votre code d'importation devrait fonctionner comme expexted.

+0

Merci, ça l'a corrigé! – SurvivalMachine

+0

J'ai essayé d'utiliser le nom décoré dans le code d'importation, c'est 'GetProcAddress (myDLL," 0MyObject @ my_name_space @@ QAE @ XZ ");' et la valeur de retour est 'NULL'. Êtes-vous sûr que cela devrait fonctionner? – Benny

+0

Pour ajouter à cela, en utilisant 'extern' C "'supprimera tout changement de nom C++, mais laissera quand même le nom C mangling. Afin d'exporter les noms simples, vous devriez regarder en utilisant un fichier .DEF. Voir https://blogs.msdn.microsoft.com/oldnewthing/20120525-00/?p=7533 – njplumridge

Questions connexes