unix_library.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:5k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. ////////////////////
  36. //
  37. // This file contains functions to load & release Shared Libraries.
  38. // It is used primarily by the codec loader/unloader code.
  39. //
  40. #include "unix_library.h"
  41. #include "hxtypes.h"
  42. #include "hxstring.h"
  43. #include "carray.h"
  44. #include "dllacces.h"
  45. //
  46. // CSharedLibMgr is a class which manages the mapping between the HMODULE
  47. // and the DLLAccess object which is used to make the actual OS calls to
  48. // open, close, etc. the library.
  49. //
  50. class CSharedLibMgr
  51. {
  52. public:
  53. static ULONG32  LoadLibrary  (const char *libname);
  54. static void  FreeLibrary  (HMODULE lib);
  55. static void * GetProcAddress (HMODULE lib, char *funcName);
  56. private:
  57. DLLAccess *dll;
  58. static CHXPtrArray mLibList;
  59. static DLLAccess * GetLib (ULONG32 index);
  60. };
  61. CHXPtrArray CSharedLibMgr::mLibList;
  62. ULONG32 CSharedLibMgr::LoadLibrary (const char *libName)
  63. {
  64. DLLAccess *pAccess = NULL;
  65. ULONG32 libIndex = DL_BAD_LIB_ID;
  66. if (libName == NULL)
  67. return DL_BAD_LIB_ID;
  68. pAccess = new DLLAccess;
  69. HX_ASSERT (pAccess);
  70. if (pAccess->open (libName) == DLLAccess::DLL_OK)
  71. {
  72. libIndex = mLibList.Add (pAccess);
  73. }
  74. else
  75. {
  76. delete pAccess;
  77. }
  78. return libIndex;
  79. }
  80. void CSharedLibMgr::FreeLibrary (HMODULE libHandle)
  81. {
  82. if (libHandle == DL_BAD_LIB_ID)
  83. return;
  84. DLLAccess *pAccess = GetLib (libHandle);
  85. if (pAccess != NULL)
  86. {
  87. pAccess->close();
  88. delete pAccess;
  89. mLibList.SetAt (libHandle, NULL);
  90. }
  91. }
  92. void *CSharedLibMgr::GetProcAddress (HMODULE libHandle, char *funcName)
  93. {
  94. if (libHandle == DL_BAD_LIB_ID || funcName == NULL)
  95. return NULL;
  96. DLLAccess *pAccess = GetLib (libHandle);
  97. HX_ASSERT (pAccess);
  98. return (pAccess->getSymbol (funcName));
  99. }
  100. DLLAccess * CSharedLibMgr::GetLib (ULONG32 index)
  101. {
  102. if (index == DL_BAD_LIB_ID)
  103. return NULL;
  104. return ((DLLAccess *)mLibList.GetAt (index));
  105. }
  106. /////////////////////////////////////////////////////////////////////////////
  107. //
  108. // Function:
  109. //
  110. // LoadLibrary()
  111. //
  112. // Purpose:
  113. //
  114. // Called to load a Shared Library given the library's name.
  115. //
  116. // Parameters:
  117. //
  118. // char* dllname
  119. // The name of the library.
  120. //
  121. // Return:
  122. //
  123. // ULONG32
  124. // Returns a handle to the library.
  125. //
  126. ULONG32 LoadLibrary(const char* dllname)
  127. {
  128. return CSharedLibMgr::LoadLibrary (dllname);
  129. }
  130. /////////////////////////////////////////////////////////////////////////////
  131. //
  132. // Function:
  133. //
  134. // FreeLibrary()
  135. //
  136. // Purpose:
  137. //
  138. // Called to free a Shared Library. If this is not called the library
  139. // will be freed when the application quits.
  140. //
  141. // Parameters:
  142. //
  143. // HMODULE lib
  144. //
  145. // Return:
  146. //
  147. // none
  148. //
  149. void FreeLibrary(HMODULE lib)
  150. {
  151. CSharedLibMgr::FreeLibrary (lib);
  152. }
  153. /////////////////////////////////////////////////////////////////////////////
  154. //
  155. // Function:
  156. //
  157. // GetProcAddress()
  158. //
  159. // Purpose:
  160. //
  161. // Called to get a function pointer in a Shared Library.
  162. //
  163. // Parameters:
  164. //
  165. // HMODULE lib
  166. //
  167. // char* function
  168. // The function name
  169. //
  170. // Return:
  171. //
  172. // void*
  173. // The address of the function.
  174. //
  175. void* GetProcAddress(HMODULE lib, char* function)
  176. {
  177. return CSharedLibMgr::GetProcAddress (lib, function);
  178. }