2013-07-29 49 views
0

我必須在Windows下通過LoadLibrary和GetProcAddress動態加載libxml2的DLL接口。我用過的所有函數指針都被正確加載,除了xmlFree。xmlFree GetProcAddress

xmlFree不是一個正常的DLL導出,而是一個函數指針。 「xmlFree」上的GetProcAddress將返回一個指向xmlFree函數指針的指針。

typedef void (*LibXmlFree) (void* mem); 
LibXmlFree xmlFree = GetProcAddress(hModule, "xmlFree"); 

這樣會成功,但調用此函數將失敗,因爲xmlFree沒有指向真正的函數。

如何創建一個正確的指向DLL的xmlFree(void *)導出的指針?

回答

0

要分配真正的xmlFree指針,必須對GetProcAddress返回的指針取消引用。

轉換的第一部分指定了結果類型,第二部分用正確的類型指定將其解除引用。

xmlFree = (void (__cdecl *)(void *)) *((void (__cdecl **)(void *)) GetProcAddress(hModule, "xmlFree")); 

同樣應該適用於libxml的的其他函數指針(的malloc,realloc的&朋友)。

0

有一個功能可按獲取地址xmlFree:

xmlGlobalState xmlMem = {}; 
xmlMemGet( &xmlMem.xmlFree, 
      &xmlMem.xmlMalloc, 
      &xmlMem.xmlRealloc, 
      &xmlMem.xmlMemStrdup 
      ); 
xmlMem.xmlFree(result); 

我有類似的問題,xmlFree爲NULL,而下MinGW的編譯。 有效地xmlFree()失敗與SIGSEGV。