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

アドレス xmlFree を取得する関数があります。

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

xmlFreemingwでコンパイルしているときに、NULLになるという同様の問題がありました。事実上、xmlFree() は SIGSEGV で失敗しました。

于 2013-08-07T11:28:29.500 に答える
0

実際の xmlFree ポインターを割り当てるには、GetProcAddress によって返されるポインターを逆参照する必要があります。

キャストの最初の部分は結果の型を指定し、2 番目の部分は適切な型指定で逆参照します。

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

同じことが libxml の他の関数ポインタ (malloc、realloc & friends) にも当てはまります。

于 2013-07-29T09:53:34.237 に答える