1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2006 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 Sam Lantinga 20 slouken (at) libsdl.org 21 */ 22 #include "SDL_config.h" 23 24 #ifdef SDL_LOADSO_WIN32 25 26 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 27 /* System dependent library loading routines */ 28 29 #define WIN32_LEAN_AND_MEAN 30 #include <windows.h> 31 32 #include "SDL_loadso.h" 33 34 void *SDL_LoadObject(const char *sofile) 35 { 36 void *handle = NULL; 37 const char *loaderror = "Unknown error"; 38 39 #if defined(_WIN32_WCE) 40 char errbuf[512]; 41 42 wchar_t *errbuf_t = SDL_malloc(512 * sizeof(wchar_t)); 43 wchar_t *sofile_t = SDL_malloc((MAX_PATH+1) * sizeof(wchar_t)); 44 45 MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sofile, -1, sofile_t, MAX_PATH); 46 handle = (void *)LoadLibrary(sofile_t); 47 48 /* Generate an error message if all loads failed */ 49 if ( handle == NULL ) { 50 FormatMessage((FORMAT_MESSAGE_IGNORE_INSERTS | 51 FORMAT_MESSAGE_FROM_SYSTEM), 52 NULL, GetLastError(), 53 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 54 errbuf_t, SDL_arraysize(errbuf), NULL); 55 WideCharToMultiByte(CP_ACP, 0, errbuf_t, -1, errbuf, 511, NULL, NULL); 56 loaderror = errbuf; 57 } 58 59 SDL_free(sofile_t); 60 SDL_free(errbuf_t); 61 62 #else /*if defined(__WIN32__)*/ 63 char errbuf[512]; 64 65 handle = (void *)LoadLibrary(sofile); 66 67 /* Generate an error message if all loads failed */ 68 if ( handle == NULL ) { 69 FormatMessage((FORMAT_MESSAGE_IGNORE_INSERTS | 70 FORMAT_MESSAGE_FROM_SYSTEM), 71 NULL, GetLastError(), 72 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 73 errbuf, SDL_arraysize(errbuf), NULL); 74 loaderror = errbuf; 75 } 76 #endif 77 78 if ( handle == NULL ) { 79 SDL_SetError("Failed loading %s: %s", sofile, loaderror); 80 } 81 return(handle); 82 } 83 84 void *SDL_LoadFunction(void *handle, const char *name) 85 { 86 void *symbol = NULL; 87 const char *loaderror = "Unknown error"; 88 89 #if defined(_WIN32_WCE) 90 char errbuf[512]; 91 int length = SDL_strlen(name); 92 93 wchar_t *name_t = SDL_malloc((length + 1) * sizeof(wchar_t)); 94 wchar_t *errbuf_t = SDL_malloc(512 * sizeof(wchar_t)); 95 96 MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, name_t, length); 97 98 symbol = (void *)GetProcAddress((HMODULE)handle, name_t); 99 if ( symbol == NULL ) { 100 FormatMessage((FORMAT_MESSAGE_IGNORE_INSERTS | 101 FORMAT_MESSAGE_FROM_SYSTEM), 102 NULL, GetLastError(), 103 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 104 errbuf_t, SDL_arraysize(errbuf), NULL); 105 WideCharToMultiByte(CP_ACP, 0, errbuf_t, -1, errbuf, 511, NULL, NULL); 106 loaderror = errbuf; 107 } 108 109 SDL_free(name_t); 110 SDL_free(errbuf_t); 111 112 #else /*if defined(WIN32)*/ 113 char errbuf[512]; 114 115 symbol = (void *)GetProcAddress((HMODULE)handle, name); 116 if ( symbol == NULL ) { 117 FormatMessage((FORMAT_MESSAGE_IGNORE_INSERTS | 118 FORMAT_MESSAGE_FROM_SYSTEM), 119 NULL, GetLastError(), 120 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 121 errbuf, SDL_arraysize(errbuf), NULL); 122 loaderror = errbuf; 123 } 124 #endif 125 126 if ( symbol == NULL ) { 127 SDL_SetError("Failed loading %s: %s", name, loaderror); 128 } 129 return(symbol); 130 } 131 132 void SDL_UnloadObject(void *handle) 133 { 134 if ( handle != NULL ) { 135 FreeLibrary((HMODULE)handle); 136 } 137 } 138 139 #endif /* SDL_LOADSO_WIN32 */ 140