Home | History | Annotate | Download | only in win32
      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