dllacces.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:8k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: dllacces.cpp,v 1.8.8.3 2004/07/09 01:44:03 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hxtypes.h"
  50. #include "hxassert.h"
  51. #include "dllpath.h"
  52. #include "dllacces.h"
  53. #include "hxstrutl.h"
  54. #include "system.ver"
  55. #include "hxheap.h"
  56. #ifdef _DEBUG
  57. #undef HX_THIS_FILE
  58. static const char HX_THIS_FILE[] = __FILE__;
  59. #endif
  60. const UINT32 DLLAccess::EXTRA_BUF_LEN = 32;
  61. #if !defined(HELIX_CONFIG_NOSTATICS)
  62. BOOL g_bReportHXCreateInstancePointer = FALSE;
  63. #endif
  64. DLLAccess::DLLAccess():
  65.     m_dllImp(0),
  66.     m_curError(0),
  67.     m_curErrorString(0),
  68.     m_isOpen(0),
  69.     m_dllName(0),
  70.     m_version(0)
  71. {
  72. }
  73. DLLAccess::DLLAccess(const char* dllName, UINT16 nLibType):
  74.     m_dllImp(0),
  75.     m_curError(0),
  76.     m_curErrorString(0),
  77.     m_isOpen(0),
  78.     m_dllName(0),
  79.     m_version(0)
  80. {
  81.     open(dllName, nLibType);
  82. }
  83. //
  84. //  NOTE:
  85. //  PLEASE PLEASE PLEASE PLEASE PLEASE
  86. //  Check that pointer before deleting it, AND ABSOLUTELY SET THAT PTR TO NULL when 
  87. //  you have deleted it!  If you don't it is possible for double deletions to happen,
  88. //  which can cause enormous problems.    
  89. //
  90. //  If I find you not doing this I am going to come talk you about why you feel so
  91. //  compelled to cause crashes.
  92. //
  93. DLLAccess::~DLLAccess()
  94. {
  95.     if(m_isOpen) // SEH 3/4/99: Added check to avoid allocating an error string.
  96.     {
  97.      close();
  98.     }
  99.     delete [] m_curErrorString;
  100.     m_curErrorString=NULL;
  101.     delete [] m_dllName;
  102.     m_dllName=NULL;
  103.     
  104.     delete [] m_version;
  105.     m_version=NULL;
  106.     delete m_dllImp;
  107.     m_dllImp = 0;
  108. }
  109. int DLLAccess::open(const char* dllName, UINT16 nLibType)
  110. {
  111.     HX_ASSERT(dllName);
  112.     if(!dllName)
  113.     {
  114. m_curError = NO_LOAD;
  115. setErrorString("Invalid DLL name");
  116. return m_curError;
  117.     }
  118.     if(m_isOpen)
  119.     {
  120. m_curError = NO_LOAD;
  121. setErrorString("DLL already open");
  122. return m_curError;
  123.     }
  124.     delete m_dllImp;
  125.     // Create DLLAccess implementation object
  126.     m_dllImp = CreateDLLImp();
  127.         
  128.     if (m_dllImp)
  129.     {
  130. CHXString strDllPath;
  131. DLLAccessPath* pDLLAccessPath = m_dllImp->GetDLLAccessPath();
  132. if ((nLibType != DLLTYPE_NOT_DEFINED) && pDLLAccessPath)
  133. {
  134.     if(pDLLAccessPath->GetPath(nLibType))
  135. strDllPath = pDLLAccessPath->GetPath(nLibType);
  136. }
  137. strDllPath += dllName;
  138. m_curError = m_dllImp->Open((const char*)strDllPath);
  139. if (m_curError == DLL_OK)
  140. {
  141.     m_isOpen = 1;
  142.     setErrorString("");
  143.     setDLLName(strDllPath);
  144.     delete [] m_version;
  145.     m_version = m_dllImp->CreateVersionStr(strDllPath);
  146.     FPSETDLLACCESSPATH pSetDLLAccessPath = 
  147. (FPSETDLLACCESSPATH)getSymbol("SetDLLAccessPath");
  148.     if(pSetDLLAccessPath && pDLLAccessPath)
  149.     {
  150. pDLLAccessPath->PassDLLAccessPath(pSetDLLAccessPath);
  151.     }
  152.     // Reset m_curError to DLL_OK since the getSymbol() call
  153.     // could have changed it's value
  154.     m_curError = DLL_OK;
  155. }
  156. else
  157. {
  158.     setErrorString(m_dllImp->GetErrorStr());
  159. }
  160.     }
  161.     else
  162.     {
  163. m_curError = NO_LOAD;
  164. setErrorString("Not enough memory");
  165.     }
  166.     return m_curError;
  167. }
  168. int DLLAccess::close()
  169. {
  170.     if(m_isOpen)
  171.     {
  172. m_curError = m_dllImp->Close();
  173. if (m_curError == DLL_OK)
  174. {
  175.     setErrorString("");
  176. }
  177. else
  178. {
  179.     setErrorString(m_dllImp->GetErrorStr());
  180. }
  181. m_isOpen = 0;
  182. setDLLName("");
  183. delete m_dllImp;
  184. m_dllImp = 0;
  185.     }
  186.     else
  187.     {
  188. m_curError = NO_LOAD;
  189. setErrorString("DLL not loaded");
  190.     }
  191.     return m_curError;
  192. }
  193. void* DLLAccess::getSymbol(const char* symName)
  194. {
  195.     void* ret = 0;
  196.     if(m_isOpen)
  197.     {
  198. HX_ASSERT(m_dllImp);
  199. ret = m_dllImp->GetSymbol(symName);
  200. if (!ret)
  201. {
  202.     m_curError = BAD_SYMBOL;
  203.     setErrorString(m_dllImp->GetErrorStr());
  204. }
  205.     }
  206.     else
  207.     {
  208. m_curError = BAD_SYMBOL;
  209. setErrorString("DLL not loaded");
  210.     }
  211.     return ret;
  212. }
  213. void DLLAccess::setErrorString(const char* str)
  214. {
  215.     if (str)
  216.     {
  217. delete [] m_curErrorString;
  218. UINT32 bufSize = strlen(str)+1;
  219. m_curErrorString = new char[bufSize];
  220.     
  221. HX_ASSERT(m_curErrorString);
  222. if (m_curErrorString)
  223. {
  224.     SafeStrCpy(m_curErrorString, str, bufSize);
  225. }
  226.     }
  227. }
  228. void DLLAccess::setDLLName(const char* str)
  229. {
  230.     if (str)
  231.     {
  232. delete [] m_dllName;    
  233. UINT32 bufSize = strlen(str)+1;
  234. m_dllName = new char[bufSize];
  235.     
  236. HX_ASSERT(m_dllName);
  237. if (m_dllName)
  238. {
  239.     SafeStrCpy(m_dllName, str, bufSize);
  240. }
  241.     }
  242. }
  243. void
  244. DLLAccess::CreateName(const char* short_name, const char* long_name, 
  245.       char* out_buf, UINT32& out_buf_len)
  246. {
  247.     CreateName(short_name, long_name, out_buf, out_buf_len, 
  248.        TARVER_MAJOR_VERSION, TARVER_MINOR_VERSION);
  249. }
  250. void
  251. DLLAccess::CreateName(const char* short_name, const char* long_name, 
  252.       char* out_buf, UINT32& out_buf_len, 
  253.       UINT32 nMajor, UINT32 nMinor)
  254. {
  255.     DLLAccessImp* pDLLAccessImp = CreateDLLImp();
  256.     
  257.     pDLLAccessImp->CreateName(short_name, long_name, out_buf, out_buf_len, nMajor, nMinor);
  258.     
  259.     HX_DELETE(pDLLAccessImp);
  260. }
  261. DLLAccessPath* DLLAccessImp::GetDLLAccessPath()
  262. {
  263.     // The default behavior is to call the
  264.     // global GetDLLAccessPath() function
  265.     return ::GetDLLAccessPath();
  266. }
  267. DLLAccessImp* DLLAccess::CreateDLLImp()
  268. {
  269. #if defined(_STATICALLY_LINKED) && defined(HELIX_CONFIG_CONSOLIDATED_CORE)
  270.     return DLLAccess::CreateMetaDLLImp();
  271. #elif defined(_STATICALLY_LINKED)
  272.     return DLLAccess::CreateStaticDLLImp();
  273. #else
  274.     return DLLAccess::CreatePlatformDLLImp();
  275. #endif
  276. }