Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
144 lines (115 loc) · 4.32 KB

SDL_sysloadso.c

File metadata and controls

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