2013-07-29 29 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。