【问题标题】:xmlFree GetProcAddressxmlFree GetProcAddress
【发布时间】:2013-07-29 09:53:34
【问题描述】:

我必须在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*) 导出的正确指针?

【问题讨论】:

    标签: winapi dll libxml2


    【解决方案1】:

    要分配真正的 xmlFree 指针,您必须取消对 GetProcAddress 返回的指针的引用。

    强制转换的第一部分指定结果类型,第二部分使用正确的类型规范取消引用它。

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

    同样适用于 libxml 的其他函数指针(malloc、realloc 和朋友)。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-10
        • 1970-01-01
        • 1970-01-01
        • 2018-10-10
        相关资源
        最近更新 更多