• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@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 
SDL_LoadObject(const char * sofile)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 
SDL_LoadFunction(void * handle,const char * name)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 
SDL_UnloadObject(void * handle)132 void SDL_UnloadObject(void *handle)
133 {
134 	if ( handle != NULL ) {
135 		FreeLibrary((HMODULE)handle);
136 	}
137 }
138 
139 #endif /* SDL_LOADSO_WIN32 */
140