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

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. #ifndef _DLLACCES_H_
  36. #define _DLLACCES_H_
  37. #if defined(_WINDOWS) || defined(_SYMBIAN) || defined(_OPENWAVE)
  38.     #define OS_DLL_PATTERN_STRING   "*.dll"
  39. #elif _MAC_UNIX
  40.     #define OS_DLL_PATTERN_STRING   "*.bundle"
  41. #elif _UNIX
  42.     #define OS_DLL_PATTERN_STRING   "*.so*"
  43. #elif _MACINTOSH
  44. #ifdef _CARBON
  45. #ifdef _MAC_MACHO
  46.     #define OS_DLL_PATTERN_STRING   "*.bundle"
  47. #else
  48.     #define OS_DLL_PATTERN_STRING   "*.shlb"
  49. #endif
  50. #else
  51.     #define OS_DLL_PATTERN_STRING   "*.dll"
  52. #endif
  53. #else // undefined platform
  54. #error dll extension undefined on platform
  55. #endif
  56. #include "hxtypes.h"
  57. class DLLAccessPath;
  58. class DLLAccessImp
  59. {
  60. public:
  61.     virtual ~DLLAccessImp() {}
  62.     virtual int Open(const char* dllName) = 0;
  63.     virtual int Close() = 0;
  64.     virtual void* GetSymbol(const char* symbolName) = 0;
  65.     virtual const char* GetErrorStr() const = 0;
  66.     virtual char* CreateVersionStr(const char* dllName) const = 0;
  67.     virtual DLLAccessPath* GetDLLAccessPath();
  68.     virtual void CreateName(const char* short_name, const char* long_name, char* out_buf,
  69.    UINT32& out_buf_len, UINT32 nMajor, UINT32 nMinor)=0;
  70. };
  71. //
  72. // This class defines the OS independent interface to loading, accessing,
  73. // and unloading dynamic code from shared libraries.
  74. //
  75. class DLLAccess
  76. {
  77. public:
  78.     /////////////////////////////////////////////////////////////
  79.     // Function: 
  80.     //     DLLAccess
  81.     //
  82.     // Parameters:
  83.     //     None
  84.     //
  85.     // Returns:
  86.     //     Nothing
  87.     //
  88.     // Notes:
  89.     //     Default constructor initializes internal structures for
  90.     //     subsequent call to open()
  91.     //
  92.     DLLAccess();
  93.     /////////////////////////////////////////////////////////////
  94.     // Function:
  95.     //     DLLAccess
  96.     //
  97.     // Parameters:
  98.     //     dllName - Name of shared library
  99.     //
  100.     // Returns:
  101.     //     Nothing
  102.     //
  103.     // Notes:
  104.     //     Attempts to load library dllName. If unsuccessful, m_curError
  105.     //     is set to DLLAccess::NO_LOAD and platform specific error
  106.     //     info is stored in m_curStringError.
  107.     //     
  108.     DLLAccess(const char* dllName, UINT16 nLibType = 0);
  109.     //////////////////////////////////////////////////////////////
  110.     // Function:
  111.     //     ~DLLAccess
  112.     //
  113.     // Paramters:
  114.     //     None
  115.     //
  116.     // Returns:
  117.     //     Nothing
  118.     //
  119.     // Notes:
  120.     //     Unloads library from memory. See 'close' below.
  121.     //
  122.     ~DLLAccess();
  123.     ///////////////////////////////////////////////////////////////
  124.     // Function:
  125.     //     open(const char* dllName)
  126.     //
  127.     // Parameters:
  128.     //     dllName - Name of shared library
  129.     //
  130.     // Returns:
  131.     //     DLLAccess::OK if successful, else DLLAccess::NO_LOAD.
  132.     //     Platform specific error info is stored in m_curStringError.
  133.     //
  134.     // Notes:
  135.     //     
  136.     int open(const char* dllName, UINT16 nLibType = 0);
  137.     ///////////////////////////////////////////////////////////////
  138.     // Function:
  139.     //     close()
  140.     //
  141.     // Parameters:
  142.     //     none
  143.     //
  144.     // Returns:
  145.     //     DLLAccess::OK if successful, else DLL_ACCESS::NO_LOAD.
  146.     //
  147.     // Notes:
  148.     //     Shared library usage is typically reference counted by the
  149.     //     OS: the library is actually unloaded when the reference count
  150.     //     reaches zero. Thus this call does not guarantee that the 
  151.     //     library will be removed from memory.
  152.     //
  153.     int close();
  154.     ///////////////////////////////////////////////////////////////
  155.     // Function:
  156.     //     getSymbol(const char* symName)
  157.     //
  158.     // Parameters:
  159.     //     symName: symbol to retrieve from shared library
  160.     //
  161.     // Returns:
  162.     //     ptr to code in library if successful, else returns NULL
  163.     //     and m_curError is set to DLLAccess::BAD_SYMBOL.
  164.     //
  165.     // Notes:
  166.     //
  167.     void* getSymbol(const char* symName);
  168.     ///////////////////////////////////////////////////////////////
  169.     // Function:
  170.     //     getError
  171.     //
  172.     // Parameters:
  173.     //     none
  174.     //
  175.     // Returns:
  176.     //     value of m_curError
  177.     //
  178.     // Notes:
  179.     //     none
  180.     //
  181.     int getError() { return m_curError; }
  182.     ///////////////////////////////////////////////////////////////
  183.     // Function:
  184.     //     getErrorString
  185.     //
  186.     // Parameters:
  187.     //     none
  188.     //
  189.     // Returns:
  190.     //     value of m_curErrorString
  191.     //
  192.     // Notes:
  193.     //     none
  194.     //
  195.     const char* getErrorString() { return m_curErrorString; }
  196.     ///////////////////////////////////////////////////////////////
  197.     // Function:
  198.     //     getDLLName
  199.     //
  200.     // Parameters:
  201.     //     none
  202.     //
  203.     // Returns:
  204.     //     value of m_DLLName
  205.     //
  206.     // Notes:
  207.     //     none
  208.     //
  209.     const char* getDLLName() { return m_dllName; }
  210.     ///////////////////////////////////////////////////////////////
  211.     // Function:
  212.     //     getVersion
  213.     //
  214.     // Parameters:
  215.     //     none
  216.     //
  217.     // Returns:
  218.     //     value of m_Version
  219.     //
  220.     // Notes:
  221.     //     none
  222.     //
  223.     const char* getVersion() { return m_version; }
  224.     /////////////////////////////////////////////////////////////
  225.     // Function: 
  226.     //     PreCloseNotification  (not a member function)
  227.     //
  228.     // Parameters:
  229.     //     None
  230.     //
  231.     // Returns:
  232.     //     Nothing
  233.     //
  234.     // Notes:
  235.     //     This function does not exist in dllaccess, but it may exist in the
  236.     //     dll that dllaccess is wrapped around.  Just before closing down the
  237.     //     the dll, dllaccess checks to see if there is a function named
  238.     //     PreCloseNotification, and if there is, it is called.  This lets
  239.     //     the dll know it is about to be closed down, before its OS close
  240.     //    function is called.  This was helpful for Win16 (because you can't
  241.     //     call FreeLibrary from the WEP), and could be useful for other
  242.     //     platforms.  As of sept98, it was only implemented for windows.
  243.     static const UINT32 EXTRA_BUF_LEN;
  244.     static void CreateName(const char* short_name, const char* long_name, char* out_buf,
  245.    UINT32& out_buf_len);
  246.     // This overloaded version has been added to allow user to specify major and minor
  247.     // version of the DLL name you are trying to create. It will append major and minor version
  248.     // to the name. If you use the other function, then the major and minor versions of pnmisc
  249.     // will be used. See pnmisc.ver in that case.
  250.     static void CreateName(const char* short_name, const char* long_name, char* out_buf,
  251.    UINT32& out_buf_len, UINT32 nMajor, UINT32 nMinor);
  252.     enum { DLL_OK, NO_LOAD, BAD_SYMBOL, OUT_OF_MEMORY };
  253.     ///////////////////////////////////////////////////////////////
  254.     // Function:
  255.     //     isOpen
  256.     //
  257.     // Parameters:
  258.     //     none
  259.     //
  260.     // Returns:
  261.     //     value of m_isOpen
  262.     //
  263.     // Notes:
  264.     //     none
  265.     //
  266.     BOOL isOpen(void)
  267.     { return(m_isOpen); }
  268.     
  269. private:
  270.     DLLAccess(const DLLAccess&);     // no defaut copy constructor
  271.     DLLAccess& operator=(const DLLAccess&); // no default assignment op
  272.     void setDLLName(const char* str);     // set m_dllName
  273.     void setVersion(const char* str);       // set m_version
  274.     void setErrorString(const char* str);   // set m_curErrorString
  275.     static DLLAccessImp* CreateDLLImp();
  276.     friend class MetaDLLAccess;
  277.     static DLLAccessImp* CreateMetaDLLImp();
  278.     static DLLAccessImp* CreatePlatformDLLImp();
  279.     static DLLAccessImp* CreateStaticDLLImp();
  280.     DLLAccessImp* m_dllImp;
  281.     int m_curError;            // last error
  282.     char* m_curErrorString;    // last error string
  283.     int m_isOpen;              // don't open lib more than once
  284.     char* m_dllName;           // DLL name
  285.     char* m_version;        // DLL version
  286. };
  287. #endif // _DLLACCES_H_