2010-01-04 80 views
2

基本上我想以平臺獨立的方式在共享對象中查找函數: 我不想處理LoadLibrary/GetProcAddress或dlopen的詳細信息。共享對象和DLL中的函數指針查找

是否有一個庫隱藏在各種操作系統的共享對象中查找函數指針的過程?我只想提供共享對象/ dll名稱和函數名稱,並獲得一個C函數指針來調用該函數。

回答

6

沒有庫是因爲使用dlsym或GetProcAddress非常簡單,因此不需要在單獨的庫中進行分解。但它是許多圖書館的一部分。

繼承人從FOX GUI工具包快速複製粘貼&:

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是必要的。