function_t dylib_proc(dylib_t lib, const char *proc) { function_t sym; void *ptr_sym = NULL; #ifdef _WIN32 sym = (function_t)GetProcAddress(lib ? (HMODULE)lib : GetModuleHandle(NULL), proc); if (!sym) { set_dl_error(); return NULL; } last_dyn_error[0] = 0; #else if (lib) ptr_sym = dlsym(lib, proc); else { void *handle = dlopen(NULL, RTLD_LAZY); if (handle) { ptr_sym = dlsym(handle, proc); dlclose(handle); } } /* Dirty hack to workaround the non-legality of * (void*) -> fn-pointer casts. */ memcpy(&sym, &ptr_sym, sizeof(void*)); #endif return sym; }
int dlclose(void *handle) { if (!FreeLibrary((HMODULE) handle)) { set_dl_error(); return 1; } last_dyn_error[0] = 0; return 0; }
/** * dylib_close: * @lib : Library handle. * * Frees library handle. **/ void dylib_close(dylib_t lib) { #ifdef _WIN32 if (!FreeLibrary((HMODULE)lib)) set_dl_error(); last_dyn_error[0] = 0; #else #ifndef NO_DLCLOSE dlclose(lib); #endif #endif }
void * dlsym(void *handle, const char *symbol) { void *ptr; ptr = GetProcAddress((HMODULE) handle, symbol); if (!ptr) { set_dl_error(); return NULL; } last_dyn_error[0] = 0; return ptr; }
void * dlopen(const char *file, int mode) { HMODULE h; int prevmode; /* Disable popup error messages when loading DLLs */ prevmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); h = LoadLibrary(file); SetErrorMode(prevmode); if (!h) { set_dl_error(); return NULL; } last_dyn_error[0] = 0; return (void *) h; }
/** * dylib_load: * @path : Path to libretro core library. * * Platform independent dylib loading. * * Returns: library handle on success, otherwise NULL. **/ dylib_t dylib_load(const char *path) { #ifdef _WIN32 int prevmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); dylib_t lib = LoadLibrary(path); SetErrorMode(prevmode); if (!lib) { set_dl_error(); return NULL; } last_dyn_error[0] = 0; #else dylib_t lib = dlopen(path, RTLD_LAZY); #endif return lib; }