2010-06-20 5 views
0

J'essaye de charger dynamiquement une DLL en utilisant LoadLibrary(), qui fonctionne, mais je ne peux pas obtenir l'adresse de la fonction dans la DLL que j'essaie d'appeler.pourquoi ne pas avoir accès à ma fonction DLL

fonction DLL: (dans le fichier RPC)

_declspec(dllexport) void MyDllFunc() 
{ 
    printf("Hello from DLL"); 
} 

Indicatif téléphonique:

typedef void (*MyDllFuncPtr)(); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    HINSTANCE LoadMe; 
    LPCWSTR str = L"C:\\Users\\Tony\\Documents\\Visual Studio 2008\\Projects\\DLL Loading\\Release\\MyDll.dll"; 

    LoadMe = LoadLibrary(str); 

    if(LoadMe != 0) 
     printf("Successfully Loaded!\r\n"); 
    else 
     printf("Loading Failed \r\n"); 


    MyDllFuncPtr func; 

    func = (MyDllFuncPtr)GetProcAddress(LoadMe, "MyDllFunc"); 

    if (func != NULL) 
     func(); 

    FreeLibrary(LoadMe); 

} 

func retourne NULL !!!

Qu'est-ce que je fais mal?

Ceci est un projet de console Win32.

+0

Si vous êtes dll est écrit en C++, alors vous devez faire correspondre le mangeage du nom C++. Affichez la table d'exportation et examinez le nom de la fonction. Ou déclarer la fonction dans la DLL en tant que extern C, ce qui supprime le mangeage du nom C++. –

Répondre

3

Ecrire

extern "C" _declspec(dllexport) void MyDllFunc() 
+0

dans DLL ou dans le code d'appel ?? –

+0

Dans DLL est suffisant. Ainsi, le nom serait correctement tronqué et vous pourrez obtenir le symbole. – Artyom

0

Si la DLL est construit comme un C++ dll, il est le nom des fonctions changera. C'est dépendant du compilateur. Je recommande fortement de faire un dll C (C interface + C++). Je n'ai pas d'exemple sur moi en ce moment, mais vous devriez être capable de trouver quelque chose sur le net.

1

Vous vous trompez. __declspec (dllexport) est associé à __declspec (dllimport).

#1: In the DLL, declare the function's prototype with __declspec(dllexport). 
#2: In the .exe, declare the function's prototype with __declspec(dllimport). 
#3: Compile the .dll. You should also get a .lib file. 
#4: Link the .exe with the .lib, and compile. 
#5: Success. 

Lorsque vous utilisez __declspec (dllimport) et __declspec (dllexport), vous ne devez jamais toucher les fonctions de WinAPI pour charger une DLL. dllimport/export fait tout pour vous. De plus, vous n'avez pas besoin d'externaliser quoi que ce soit.

1

Vos fonctions exportées le nom de sont en cours decorated lors de l'utilisation __declspec(dllexport), vous pouvez réduire la décoration en utilisant extern "C", cependant, il ne sera pas entièrement undecorated le symbole, pour ce faire vous devez utiliser un def file et l'exporter comme un symbole nommé, Sinon, vous devez utiliser GetProcAddress en utilisant le nom du symbole tronqué/décoré, qui est court lors de l'exportation en utilisant extern "C".

+0

Bon point, les gens ont tendance à oublier que beaucoup de compilateurs C décorer des noms aussi. – bk1e

Questions connexes