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

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. #include "hxtypes.h"
  36. #include "hxassert.h"
  37. #include "dllpath.h"
  38. #include "dllacces.h"
  39. #include "hxstrutl.h"
  40. #include "system.ver"
  41. #include "hxheap.h"
  42. #ifdef _DEBUG
  43. #undef HX_THIS_FILE
  44. static const char HX_THIS_FILE[] = __FILE__;
  45. #endif
  46. const UINT32 DLLAccess::EXTRA_BUF_LEN = 32;
  47. #if !defined(HELIX_CONFIG_NOSTATICS)
  48. BOOL g_bReportHXCreateInstancePointer = FALSE;
  49. #endif
  50. DLLAccess::DLLAccess():
  51.     m_dllImp(0),
  52.     m_curError(0),
  53.     m_curErrorString(0),
  54.     m_isOpen(0),
  55.     m_dllName(0),
  56.     m_version(0)
  57. {
  58. }
  59. DLLAccess::DLLAccess(const char* dllName, UINT16 nLibType):
  60.     m_dllImp(0),
  61.     m_curError(0),
  62.     m_curErrorString(0),
  63.     m_isOpen(0),
  64.     m_dllName(0),
  65.     m_version(0)
  66. {
  67.     open(dllName, nLibType);
  68. }
  69. //
  70. //  NOTE:
  71. //  PLEASE PLEASE PLEASE PLEASE PLEASE
  72. //  Check that pointer before deleting it, AND ABSOLUTELY SET THAT PTR TO NULL when 
  73. //  you have deleted it!  If you don't it is possible for double deletions to happen,
  74. //  which can cause enormous problems.    
  75. //
  76. //  If I find you not doing this I am going to come talk you about why you feel so
  77. //  compelled to cause crashes.
  78. //
  79. DLLAccess::~DLLAccess()
  80. {
  81.     if(m_isOpen) // SEH 3/4/99: Added check to avoid allocating an error string.
  82.     {
  83.      close();
  84.     }
  85.     delete [] m_curErrorString;
  86.     m_curErrorString=NULL;
  87.     delete [] m_dllName;
  88.     m_dllName=NULL;
  89.     
  90.     delete [] m_version;
  91.     m_version=NULL;
  92.     delete m_dllImp;
  93.     m_dllImp = 0;
  94. }
  95. int DLLAccess::open(const char* dllName, UINT16 nLibType)
  96. {
  97.     HX_ASSERT(dllName);
  98.     if(!dllName)
  99.     {
  100. m_curError = NO_LOAD;
  101. setErrorString("Invalid DLL name");
  102. return m_curError;
  103.     }
  104.     if(m_isOpen)
  105.     {
  106. m_curError = NO_LOAD;
  107. setErrorString("DLL already open");
  108. return m_curError;
  109.     }
  110.     delete m_dllImp;
  111.     // Create DLLAccess implementation object
  112.     m_dllImp = CreateDLLImp();
  113.         
  114.     if (m_dllImp)
  115.     {
  116. CHXString strDllPath;
  117. DLLAccessPath* pDLLAccessPath = m_dllImp->GetDLLAccessPath();
  118. if ((nLibType != DLLTYPE_NOT_DEFINED) && pDLLAccessPath)
  119. {
  120.     if(pDLLAccessPath->GetPath(nLibType))
  121. strDllPath = pDLLAccessPath->GetPath(nLibType);
  122. }
  123. strDllPath += dllName;
  124. m_curError = m_dllImp->Open((const char*)strDllPath);
  125. if (m_curError == DLL_OK)
  126. {
  127.     m_isOpen = 1;
  128.     setErrorString("");
  129.     setDLLName(strDllPath);
  130.     delete [] m_version;
  131.     m_version = m_dllImp->CreateVersionStr(strDllPath);
  132.     FPSETDLLACCESSPATH pSetDLLAccessPath = 
  133. (FPSETDLLACCESSPATH)getSymbol("SetDLLAccessPath");
  134.     if(pSetDLLAccessPath && pDLLAccessPath)
  135.     {
  136. pDLLAccessPath->PassDLLAccessPath(pSetDLLAccessPath);
  137.     }
  138.     // Reset m_curError to DLL_OK since the getSymbol() call
  139.     // could have changed it's value
  140.     m_curError = DLL_OK;
  141. }
  142. else
  143. {
  144.     setErrorString(m_dllImp->GetErrorStr());
  145. }
  146.     }
  147.     else
  148.     {
  149. m_curError = NO_LOAD;
  150. setErrorString("Not enough memory");
  151.     }
  152.     return m_curError;
  153. }
  154. int DLLAccess::close()
  155. {
  156.     if(m_isOpen)
  157.     {
  158. m_curError = m_dllImp->Close();
  159. if (m_curError == DLL_OK)
  160. {
  161.     setErrorString("");
  162. }
  163. else
  164. {
  165.     setErrorString(m_dllImp->GetErrorStr());
  166. }
  167. m_isOpen = 0;
  168. setDLLName("");
  169. delete m_dllImp;
  170. m_dllImp = 0;
  171.     }
  172.     else
  173.     {
  174. m_curError = NO_LOAD;
  175. setErrorString("DLL not loaded");
  176.     }
  177.     return m_curError;
  178. }
  179. void* DLLAccess::getSymbol(const char* symName)
  180. {
  181.     void* ret = 0;
  182.     if(m_isOpen)
  183.     {
  184. HX_ASSERT(m_dllImp);
  185. ret = m_dllImp->GetSymbol(symName);
  186. if (!ret)
  187. {
  188.     m_curError = BAD_SYMBOL;
  189.     setErrorString(m_dllImp->GetErrorStr());
  190. }
  191.     }
  192.     else
  193.     {
  194. m_curError = BAD_SYMBOL;
  195. setErrorString("DLL not loaded");
  196.     }
  197.     return ret;
  198. }
  199. void DLLAccess::setErrorString(const char* str)
  200. {
  201.     if (str)
  202.     {
  203. delete [] m_curErrorString;
  204. UINT32 bufSize = strlen(str)+1;
  205. m_curErrorString = new char[bufSize];
  206.     
  207. HX_ASSERT(m_curErrorString);
  208. if (m_curErrorString)
  209. {
  210.     SafeStrCpy(m_curErrorString, str, bufSize);
  211. }
  212.     }
  213. }
  214. void DLLAccess::setDLLName(const char* str)
  215. {
  216.     if (str)
  217.     {
  218. delete [] m_dllName;    
  219. UINT32 bufSize = strlen(str)+1;
  220. m_dllName = new char[bufSize];
  221.     
  222. HX_ASSERT(m_dllName);
  223. if (m_dllName)
  224. {
  225.     SafeStrCpy(m_dllName, str, bufSize);
  226. }
  227.     }
  228. }
  229. void
  230. DLLAccess::CreateName(const char* short_name, const char* long_name, 
  231.       char* out_buf, UINT32& out_buf_len)
  232. {
  233.     CreateName(short_name, long_name, out_buf, out_buf_len, 
  234.        TARVER_MAJOR_VERSION, TARVER_MINOR_VERSION);
  235. }
  236. void
  237. DLLAccess::CreateName(const char* short_name, const char* long_name, 
  238.       char* out_buf, UINT32& out_buf_len, 
  239.       UINT32 nMajor, UINT32 nMinor)
  240. {
  241.     DLLAccessImp* pDLLAccessImp = CreateDLLImp();
  242.     
  243.     pDLLAccessImp->CreateName(short_name, long_name, out_buf, out_buf_len, nMajor, nMinor);
  244.     
  245.     HX_DELETE(pDLLAccessImp);
  246. }
  247. DLLAccessPath* DLLAccessImp::GetDLLAccessPath()
  248. {
  249.     // The default behavior is to call the
  250.     // global GetDLLAccessPath() function
  251.     return ::GetDLLAccessPath();
  252. }
  253. DLLAccessImp* DLLAccess::CreateDLLImp()
  254. {
  255. #if defined(_STATICALLY_LINKED) && defined(HELIX_CONFIG_CONSOLIDATED_CORE)
  256.     return DLLAccess::CreateMetaDLLImp();
  257. #elif defined(_STATICALLY_LINKED)
  258.     return DLLAccess::CreateStaticDLLImp();
  259. #else
  260.     return DLLAccess::CreatePlatformDLLImp();
  261. #endif
  262. }