2010-01-04 1 views
2

В принципе, я хотел бы искать функцию в совместно используемом объекте независимым от платформы способом: Я не хочу иметь дело с данными LoadLibrary/GetProcAddress или dlopen.поиск указателя функции в совместно используемом объекте и dll

Есть ли библиотека, которая скрывает процесс поиска указателя функции в общих объектах в разных операционных системах? Я хотел бы просто предоставить имя общего объекта/dll и имя функции и получить указатель функции C для вызова этой функции.

ответ

6

Нет библиотеки, поскольку использование dlsym или GetProcAddress настолько просто, что его не стоит учитывать в отдельной библиотеке. Но это часть многих библиотек.

Heres быстрый Копировать & Вставить из FOX GUI Toolkit:

void* fxdllOpen(const FXchar *dllname){ 
    if(dllname){ 
#ifndef WIN32 
#ifdef HAVE_SHL_LOAD // HP-UX 
    return shl_load(dllname,BIND_IMMEDIATE|BIND_NONFATAL|DYNAMIC_PATH,0L); 
#else 
#ifdef DL_LAZY  // OpenBSD 
    return dlopen(dllname,DL_LAZY); 
#else   // POSIX 
    return dlopen(dllname,RTLD_NOW|RTLD_GLOBAL); 
#endif 
#endif 
#else     // WIN32 
    return LoadLibraryExA(dllname,NULL,LOAD_WITH_ALTERED_SEARCH_PATH); 
#endif 
    } 
    return NULL; 
    } 


void fxdllClose(void* dllhandle){ 
    if(dllhandle){ 
#ifndef WIN32 
#ifdef HAVE_SHL_LOAD // HP-UX 
    shl_unload((shl_t)dllhandle); 
#else   // POSIX 
    dlclose(dllhandle); 
#endif 
#else     // WIN32 
    FreeLibrary((HMODULE)dllhandle); 
#endif 
    } 
    } 


void* fxdllSymbol(void* dllhandle,const FXchar* dllsymbol){ 
    if(dllhandle && dllsymbol){ 
#ifndef WIN32 
#ifdef HAVE_SHL_LOAD // HP-UX 
    void* address=NULL; 
    if(shl_findsym((shl_t*)&dllhandle,dllsymbol,TYPE_UNDEFINED,&address)==0) return address; 
#else   // POSIX 
    return dlsym(dllhandle,dllsymbol); 
#endif 
#else     // WIN32 
    return (void*)GetProcAddress((HMODULE)dllhandle,dllsymbol); 
#endif 
    } 
    return NULL; 
    } 
2

Взгляните на то, как это было сделано в наддува, interprocess/detail/os_file_functions.hpp. Никакая магия здесь, #ifdef не требуется.