поиск указателя на функцию в общем объекте и DLL - PullRequest
2 голосов
/ 04 января 2010

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

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

Ответы [ 2 ]

6 голосов
/ 04 января 2010

Нет библиотеки, потому что использовать 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 голосов
/ 04 января 2010

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

...