2

基本的に、プラットフォームに依存しない方法で共有オブジェクト内の関数を検索したいと思います。LoadLibrary/GetProcAddressまたはdlopenの詳細を処理したくありません。

さまざまなオペレーティングシステムの共有オブジェクトで関数ポインタを検索するプロセスを隠すライブラリはありますか?共有オブジェクト/dll名と関数名を指定し、その関数を呼び出すためのC関数ポインターを取得したいと思います。

4

2 に答える 2

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;
  }
于 2010-01-04T19:35:50.430 に答える
2

ブーストでどのように行われたかを見てみましょうinterprocess/detail/os_file_functions.hpp。ここに魔法#ifdefは必要ありません。

于 2010-01-04T19:36:38.073 に答える