SDL_loadso.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_loadso.c,v 1.1 2002/04/22 21:38:01 wmay Exp $";
  21. #endif
  22. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  23. /* System dependent library loading routines                           */
  24. #include <stdio.h>
  25. #if defined(USE_DLOPEN)
  26. # include <dlfcn.h>
  27. #elif defined(WIN32)
  28. # include <windows.h>
  29. #elif defined(__BEOS__)
  30. # include <be/kernel/image.h>
  31. #elif defined(macintosh)
  32. # include <string.h>
  33. # include <Strings.h>
  34. # include <CodeFragments.h>
  35. # include <Errors.h>
  36. #else
  37. /*#error Unsupported dynamic link environment*/
  38. #endif /* system type */
  39. #include "SDL_types.h"
  40. #include "SDL_error.h"
  41. #include "SDL_loadso.h"
  42. void *SDL_LoadObject(const char *sofile)
  43. {
  44. void *handle = NULL;
  45. const char *loaderror = "SDL_LoadObject() not implemented";
  46. #if defined(USE_DLOPEN)
  47. /* * */
  48. handle = dlopen(sofile, RTLD_NOW);
  49. loaderror = (char *)dlerror();
  50. #elif defined(WIN32)
  51. /* * */
  52. char errbuf[512];
  53. handle = (void *)LoadLibrary(sofile);
  54. /* Generate an error message if all loads failed */
  55. if ( handle == NULL ) {
  56. FormatMessage((FORMAT_MESSAGE_IGNORE_INSERTS |
  57. FORMAT_MESSAGE_FROM_SYSTEM),
  58. NULL, GetLastError(), 
  59. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  60. errbuf, SDL_TABLESIZE(errbuf), NULL);
  61. loaderror = errbuf;
  62. }
  63. #elif defined(__BEOS__)
  64. /* * */
  65. image_id library_id;
  66. library_id = load_add_on(sofile);
  67. if ( library_id == B_ERROR ) {
  68. loaderror = "BeOS error";
  69. } else {
  70. handle = (void *)(library_id);
  71. }
  72. #elif defined(macintosh)
  73. /* * */
  74. CFragConnectionID library_id;
  75. Ptr mainAddr;
  76. Str255 errName;
  77. OSErr error;
  78. char psofile[512];
  79. strncpy(psofile, sofile, SDL_TABLESIZE(psofile));
  80. psofile[SDL_TABLESIZE(psofile)-1] = '';
  81. error = GetSharedLibrary(C2PStr(psofile), kCompiledCFragArch,
  82. kLoadCFrag, &library_id, &mainAddr, errName);
  83. switch (error) {
  84. case noErr:
  85. break;
  86. case cfragNoLibraryErr:
  87. loaderror = "Library not found";
  88. break;
  89. case cfragUnresolvedErr:
  90. loaderror = "Unabled to resolve symbols";
  91. break;
  92. case cfragNoPrivateMemErr:
  93. case cfragNoClientMemErr:
  94. loaderror = "Out of memory";
  95. break;
  96. default:
  97. loaderror = "Unknown Code Fragment Manager error";
  98. break;
  99. }
  100. if ( loaderror == NULL ) {
  101. handle = (void *)(library_id);
  102. }
  103. #endif /* system type */
  104. if ( handle == NULL ) {
  105. SDL_SetError("Failed loading %s: %s", sofile, loaderror);
  106. }
  107. return(handle);
  108. }
  109. void *SDL_LoadFunction(void *handle, const char *name)
  110. {
  111. void *symbol = NULL;
  112. const char *loaderror = "SDL_LoadFunction not implemented";
  113. #if defined(USE_DLOPEN)
  114. /* * */
  115. symbol = dlsym(handle, name);
  116. if ( symbol == NULL ) {
  117. loaderror = (char *)dlerror();
  118. }
  119. #elif defined(WIN32)
  120. /* * */
  121. char errbuf[512];
  122. symbol = (void *)GetProcAddress((HMODULE)handle, name);
  123. if ( symbol == NULL ) {
  124. FormatMessage((FORMAT_MESSAGE_IGNORE_INSERTS |
  125. FORMAT_MESSAGE_FROM_SYSTEM),
  126. NULL, GetLastError(), 
  127. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  128. errbuf, SDL_TABLESIZE(errbuf), NULL);
  129. loaderror = errbuf;
  130. }
  131. #elif defined(__BEOS__)
  132. /* * */
  133. image_id library_id = (image_id)handle;
  134. if ( get_image_symbol(library_id,
  135. name, B_SYMBOL_TYPE_TEXT, &symbol) != B_NO_ERROR ) {
  136. loaderror = "Symbol not found";
  137. }
  138. #elif defined(macintosh)
  139. /* * */
  140. CFragSymbolClass class;
  141. CFragConnectionID library_id = (CFragConnectionID)handle;
  142. char pname[512];
  143. strncpy(pname, name, SDL_TABLESIZE(pname));
  144. pname[SDL_TABLESIZE(pname)-1] = '';
  145. if ( FindSymbol(library_id, C2PStr(pname),
  146.                 (char **)&symbol, &class) != noErr ) {
  147. loaderror = "Symbol not found";
  148. }
  149. #endif /* system type */
  150. if ( symbol == NULL ) {
  151. SDL_SetError("Failed loading %s: %s", name, loaderror);
  152. }
  153. return(symbol);
  154. }
  155. void SDL_UnloadObject(void *handle)
  156. {
  157. #if defined(__BEOS__)
  158. image_id library_id;
  159. #endif
  160. if ( handle == NULL ) {
  161. return;
  162. }
  163. #if defined(USE_DLOPEN)
  164. /* * */
  165. dlclose(handle);
  166. #elif defined(WIN32)
  167. /* * */
  168. FreeLibrary((HMODULE)handle);
  169. #elif defined(__BEOS__)
  170. /* * */
  171. library_id = (image_id)handle;
  172. unload_add_on(library_id);
  173. #elif defined(macintosh)
  174. /* * */
  175. CFragConnectionID library_id = (CFragConnectionID)handle;
  176. CloseConnection(library_id);
  177. #endif /* system type */
  178. }