Symboles externes non résolus dans DLL DLL

J’essaie de créer une DLL proxy pour ‘Version.dll‘ mais continue à rencontrer des erreurs liées aux fonctions exscopes.

00000000 characteristics 4A5BC9E3 time date stamp Tue Jul 14 05:27:23 2009 0.00 version 1 ordinal base 15 number of functions 15 number of names ordinal hint RVA name 1 0 00001B14 GetFileVersionInfoA 2 1 00001E40 GetFileVersionInfoByHandle 3 2 0000193C GetFileVersionInfoExW 4 3 00001AB4 GetFileVersionInfoSizeA 5 4 000014E8 GetFileVersionInfoSizeExW 6 5 000015FC GetFileVersionInfoSizeW 7 6 00001614 GetFileVersionInfoW 8 7 00002820 VerFindFileA 9 8 00003F50 VerFindFileW 10 9 00002AF0 VerInstallFileA 11 A 000043F8 VerInstallFileW 12 B VerLanguageNameA (forwarded to KERNEL32.VerLanguageNameA) 13 C VerLanguageNameW (forwarded to KERNEL32.VerLanguageNameW) 14 D 00001B94 VerQueryValueA 15 E 000015E0 VerQueryValueW 

Mon code ressemble à ceci:

 extern "C" { BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) { if (dwReason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls((HMODULE)hDllHandle); // do stuff } return TRUE; } DWORD APIENTRY Wrapper_GetFileVersionInfoSizeExA(__in DWORD dwFlags, __in LPCSTR lpwstrFilename, __out LPDWORD lpdwHandle) { return ::GetFileVersionInfoSizeExA(dwFlags, lpwstrFilename, lpdwHandle); } // and so on for the rest } 

Le fichier de définition des exportations:

 LIBRARY Version EXPORTS GetFileVersionInfoA=Wrapper_GetFileVersionInfoA GetFileVersionInfoByHandle=Wrapper_GetFileVersionInfoByHandle GetFileVersionInfoExW=Wrapper_GetFileVersionInfoExW GetFileVersionInfoSizeA=Wrapper_GetFileVersionInfoSizeA GetFileVersionInfoSizeExW=Wrapper_GetFileVersionInfoSizeExW GetFileVersionInfoSizeW=Wrapper_GetFileVersionInfoSizeW GetFileVersionInfoW=Wrapper_GetFileVersionInfoW VerFindFileA=Wrapper_VerFindFileA VerFindFileW=Wrapper_VerFindFileW VerInstallFileA=Wrapper_VerInstallFileA VerInstallFileW=Wrapper_VerInstallFileW VerLanguageNameA=Wrapper_VerLanguageNameA VerLanguageNameW=Wrapper_VerLanguageNameW VerQueryValueA=Wrapper_VerQueryValueA VerQueryValueW=Wrapper_VerQueryValueW 

J’utilise différents noms de fonctions pour éviter les erreurs de redéfinition des prototypes en incluant le fichier d’en-tête Windows.h. Tenter de générer ce qui précède génère les erreurs suivantes:

 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoW@16 1>Main.obj : error LNK2001: unresolved external symbol _VerQueryValueA@16 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeA@8 1>Main.obj : error LNK2001: unresolved external symbol _VerQueryValueW@16 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeExW@12 1>Main.obj : error LNK2001: unresolved external symbol _VerInstallFileA@32 1>Main.obj : error LNK2001: unresolved external symbol _VerInstallFileW@32 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoA@16 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoExW@20 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeW@8 1>Main.obj : error LNK2001: unresolved external symbol _VerFindFileW@32 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeExA@12 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoExA@20 

C’est la première fois que j’essaie de créer une DLL proxy, alors il se peut que je manque quelque chose d’évident. Merci.

Les messages d’erreur de l’éditeur de liens vous GetFileVersionInfoW que votre DLL ne fournit pas de définitions pour GetFileVersionInfoW , VerQueryValueA etc. Le fait qu’il VerQueryValueA une DLL proxy ne change pas vraiment les choses. Ceci est la classique, classique, échec de l’éditeur de liens. Vous avez déclaré une fonction, mais vous ne l’avez pas définie.

Vous vous attendez probablement à ce que ces implémentations de fonctions proviennent de la DLL du système, Version.dll . Dans ce cas, vous devez fournir la bibliothèque d’importation appropriée, version.lib , à l’éditeur de liens pour fournir des définitions.

Lorsque vous rencontrez une erreur comme celle-ci, il est toujours utile de lire la documentation . Ça dit:

Le code fait référence à quelque chose (comme une fonction, une variable ou une étiquette) que l’éditeur de liens ne peut pas trouver dans les bibliothèques et les fichiers objects.

Cela ne pourrait pas être beaucoup plus clair à mon avis. Vous avez référencé quelque chose qui a été déclaré mais non défini.

Vous devez append la version.lib à vos dépendances supplémentaires dans la page de propriétés de l’éditeur de liens.

Ou vous pouvez append ce qui suit à votre code:

 #pragma comment(lib,"version")