From 1fa4939a38fcb3ee5ac71427b4a8783bffbdaab4 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 13 Feb 2014 11:05:24 -0800 Subject: [PATCH] Added SDL_GetLoadedModule to do the equivalent of GetModuleHandle/dlload(NOLOAD) CR: Jorgen --- include/SDL_loadso.h | 10 ++++++++++ src/loadso/dlopen/SDL_sysloadso.c | 7 +++++++ src/loadso/windows/SDL_sysloadso.c | 16 ++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/include/SDL_loadso.h b/include/SDL_loadso.h index 0359eae17ddaa..50df510d818e7 100644 --- a/include/SDL_loadso.h +++ b/include/SDL_loadso.h @@ -57,6 +57,16 @@ extern "C" { */ extern DECLSPEC void *SDLCALL SDL_LoadObject(const char *sofile); +/** + * This function returns a handle to an already-loaded shared object and + * returns a pointer to the object handle. If the object file was not loaded + * the function returns NULL. This function adds a reference to the shared + * object, so the caller should call SDL_UnloadObject when they are finished + * with this reference to ensure that the object can be unloaded. + * The 'sofile' parameter is a system dependent name of the object file. + */ +extern DECLSPEC void *SDLCALL SDL_GetLoadedObject(const char *sofile); + /** * Given an object handle, this function looks up the address of the * named function in the shared object and returns it. This address diff --git a/src/loadso/dlopen/SDL_sysloadso.c b/src/loadso/dlopen/SDL_sysloadso.c index db8422221e1e0..79df107f0c49a 100644 --- a/src/loadso/dlopen/SDL_sysloadso.c +++ b/src/loadso/dlopen/SDL_sysloadso.c @@ -41,6 +41,13 @@ SDL_LoadObject(const char *sofile) return (handle); } +void * +SDL_GetLoadedObject(const char *sofile) +{ + void *handle = dlopen(sofile, RTLD_NOLOAD); + return (handle); +} + void * SDL_LoadFunction(void *handle, const char *name) { diff --git a/src/loadso/windows/SDL_sysloadso.c b/src/loadso/windows/SDL_sysloadso.c index cbbd92978adea..4ff36af0e6165 100644 --- a/src/loadso/windows/SDL_sysloadso.c +++ b/src/loadso/windows/SDL_sysloadso.c @@ -46,6 +46,22 @@ SDL_LoadObject(const char *sofile) return handle; } +void * +SDL_GetLoadedObject(const char *sofile) +{ + LPTSTR tstr = WIN_UTF8ToString(sofile); + void *handle = (void *) GetModuleHandle(tstr); + + /* if we got a handle, call LoadLibrary to get + * it again with the ref count incremented. + * We do this to match the dlopen version of this function */ + handle = (void *)LoadLibrary( tstr ); + + SDL_free(tstr); + + return handle; +} + void * SDL_LoadFunction(void *handle, const char *name) {