0

我必须在Windows下通过LoadLibrary和GetProcAddress动态加载libxml2的DLL接口。我使用的所有函数指针都已正确加载,但 xmlFree 除外。

xmlFree 不是一个普通的 DLL 导出,而是一个函数指针。因此,“xmlFree”上的 GetProcAddress 将返回一个指向 xmlFree 函数的指针。

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

因此这将成功,但调用此函数将失败,因为 xmlFree 不指向真正的函数。

如何创建指向 DLL 的 xmlFree(void*) 导出的正确指针?

4

2 回答 2

0

To assign the real xmlFree pointer you have to dereference the pointer returned by GetProcAddress.

The first part of the cast specifies the result type, the second part dereferences it with the proper type specification.

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

Same should apply to libxml's other function pointers (malloc, realloc & friends).

于 2013-07-29T09:53:34.237 回答
0

有一个获取地址 xmlFree 的函数:

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

xmlFree在 mingw 下编译时,我遇到了类似的 NULL 问题。实际上 xmlFree() 因 SIGSEGV 而失败。

于 2013-08-07T11:28:29.500 回答