2013-07-29 3 views
0

Мне нужно динамически загружать DLL-интерфейс libxml2 через LoadLibrary и GetProcAddress под Windows. Все указатели функций, которые я использовал, правильно загружены, за исключением xmlFree.xmlFree GetProcAddress

xmlFree не обычный экспорт DLL, а вместо этого указатель на функцию. GetProcAddress на «xmlFree», таким образом, возвращает указатель на указатель на функцию xmlFree.

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

Это будет успешно, но вызов этой функции завершится неудачно, потому что xmlFree не указывает на действительную функцию.

Как создать правильный указатель на экспорт xmlFree (void *) DLL?

ответ

0

Чтобы назначить реальный указатель xmlFree, вы должны разыменовать указатель, возвращаемый GetProcAddress.

Первая часть приведения задает тип результата, вторая часть разделяет ее на соответствующую спецификацию типа.

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

же должны применяться к другим указателям на функции Libxml в (таНос, перераспределить & друзей).

0

Существует Funciton, чтобы получить адрес xmlFree:

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

Я была аналогичная проблема с xmlFree будучи NULL, при компиляции под MinGW. Эффективно xmlFree() не удалось выполнить с помощью SIGSEGV.

Смежные вопросы