test_ncbidll.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbidll.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:10:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbidll.cpp,v 1000.2 2004/06/01 19:10:03 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author: Vladimir Ivanov
  35.  *
  36.  * File Description:
  37.  *   Portable DLL handling test
  38.  * Note:
  39.  *   This test use simple DLL (coremake/test/test_dll). It must be compiled 
  40.  *   and copied to project's directory before run the test.
  41.  *
  42.  */
  43. #include <ncbi_pch.hpp>
  44. #include <corelib/ncbiapp.hpp>
  45. #include <corelib/ncbiargs.hpp>
  46. #include <corelib/ncbidll.hpp>
  47. #include <test/test_assert.h>  /* This header must go last */
  48. USING_NCBI_SCOPE;
  49. /////////////////////////////////
  50. // 
  51. // Common CDll test
  52. //
  53. static void s_TEST_SimpleDll(void)
  54. {
  55.     CDll dll("./","test_dll", CDll::eLoadLater);
  56.     // Load DLL
  57.     dll.Load();
  58.     // DLL variable definition
  59.     int*    DllVar_Counter;
  60.     // DLL functions definition    
  61.     int     (* Dll_Inc) (int) = NULL;
  62.     int     (* Dll_Add) (int, int) = NULL;
  63.     string* (* Dll_StrRepeat) (const string&, unsigned int) = NULL;
  64.     // Get addresses from DLL
  65.     DllVar_Counter = dll.GetEntryPoint_Data("DllVar_Counter", &DllVar_Counter);
  66.     if ( !DllVar_Counter ) {
  67.         ERR_POST(Fatal << "Error get address of variable DllVar_Counter.");
  68.     }
  69.     Dll_Inc = dll.GetEntryPoint_Func("Dll_Inc", &Dll_Inc );
  70.     if ( !Dll_Inc ) {
  71.         ERR_POST(Fatal << "Error get address of function Dll_Inc().");
  72.     }
  73.     Dll_Add = dll.GetEntryPoint_Func("Dll_Add", &Dll_Add );
  74.     if ( !Dll_Add ) {
  75.         ERR_POST(Fatal << "Error get address of function Dll_Add().");
  76.     }
  77.     Dll_StrRepeat = dll.GetEntryPoint_Func("Dll_StrRepeat", &Dll_StrRepeat );
  78.     if ( !Dll_StrRepeat ) {
  79.         ERR_POST(Fatal << "Error get address of function Dll_StrRepeat().");
  80.     }
  81.     // Call loaded function
  82.     assert( *DllVar_Counter == 0  );
  83.     assert( Dll_Inc(3)      == 3  );
  84.     assert( *DllVar_Counter == 3  );
  85.     assert( Dll_Inc(100)    == 103);
  86.     assert( *DllVar_Counter == 103);
  87.     *DllVar_Counter = 1;
  88.     assert( Dll_Inc(0)      == 1  );
  89.     assert( Dll_Add(3,4)    == 7  );
  90.     assert( Dll_Add(-2,-1)  == -3 );
  91.     
  92.     string* str = Dll_StrRepeat("ab",2);
  93.     assert( *str == "abab");
  94.     str = Dll_StrRepeat("a",4);  
  95.     assert( *str == "aaaa");
  96.     // Unload used dll
  97.     dll.Unload();
  98. }
  99. /////////////////////////////////
  100. // 
  101. //  Load windows systems DLL
  102. //
  103. static void s_TEST_WinSystemDll(void)
  104. {
  105. #if defined NCBI_OS_MSWIN
  106.     CDll dll_user32("USER32", CDll::eLoadLater);
  107.     CDll dll_userenv("userenv.dll", CDll::eLoadNow, CDll::eAutoUnload);
  108.     // Load DLL
  109.     dll_user32.Load();
  110.     // DLL functions definition    
  111.     BOOL (STDMETHODCALLTYPE FAR * dllMessageBeep) 
  112.             (UINT type) = NULL;
  113.     BOOL (STDMETHODCALLTYPE FAR * dllGetProfilesDirectory) 
  114.             (LPTSTR  lpProfilesDir, LPDWORD lpcchSize) = NULL;
  115.     // This is other variant of functions definition
  116.     //
  117.     // typedef BOOL (STDMETHODCALLTYPE FAR * LPFNMESSAGEBEEP) (
  118.     //     UINT uType
  119.     // );
  120.     // LPFNMESSAGEBEEP  dllMessageBeep = NULL;
  121.     //
  122.     // typedef BOOL (STDMETHODCALLTYPE FAR * LPFNGETPROFILESDIR) (
  123.     //     LPTSTR  lpProfilesDir,
  124.     //     LPDWORD lpcchSize
  125.     // );
  126.     // LPFNGETUSERPROFILESDIR  dllGetProfilesDirectory = NULL;
  127.     dllMessageBeep = dll_user32.GetEntryPoint_Func("MessageBeep", &dllMessageBeep );
  128.     if ( !dllMessageBeep ) {
  129.         ERR_POST(Fatal << "Error get address of function MessageBeep().");
  130.     }
  131.     // Call loaded function
  132.     dllMessageBeep(-1);
  133.     #ifdef UNICODE
  134.     dll_userenv.GetEntryPoint_Func("GetProfilesDirectoryW", &dllGetProfilesDirectory);
  135.     #else
  136.     dll_userenv.GetEntryPoint_Func("GetProfilesDirectoryA", &dllGetProfilesDirectory);
  137.     #endif
  138.     if ( !dllGetProfilesDirectory ) {
  139.         ERR_POST(Fatal <<
  140.                  "Error get address of function GetUserProfileDirectory().");
  141.     }
  142.     // Call loaded function
  143.     TCHAR szProfilePath[1024];
  144.     DWORD cchPath = 1024;
  145.     if ( dllGetProfilesDirectory(szProfilePath, &cchPath) ) {
  146.         cout << "Profile dir: " << szProfilePath << endl;
  147.     } else {
  148.         ERR_POST(Fatal << "GetProfilesDirectory() failed");
  149.     }
  150.     // Unload USER32.DLL (our work copy)
  151.     dll_user32.Unload();
  152.     // USERENV.DLL will be unloaded in the destructor
  153.     // dll_userenv.Unload();
  154. #endif
  155. }
  156. ////////////////////////////////
  157. // Test application
  158. //
  159. class CTest : public CNcbiApplication
  160. {
  161. public:
  162.     void Init(void);
  163.     int Run(void);
  164. };
  165. void CTest::Init(void)
  166. {
  167.     SetDiagPostLevel(eDiag_Warning);
  168.     auto_ptr<CArgDescriptions> d(new CArgDescriptions);
  169.     d->SetUsageContext("test_dll", "DLL accessory class");
  170.     SetupArgDescriptions(d.release());
  171. }
  172. int CTest::Run(void)
  173. {
  174.     cout << "Run test" << endl << endl;
  175.     // Common test
  176.     s_TEST_SimpleDll();
  177.     // Windows only extended test
  178.     s_TEST_WinSystemDll();
  179.     cout << endl;
  180.     cout << "TEST execution completed successfully!" << endl << endl;
  181.     return 0;
  182. }
  183. ///////////////////////////////////
  184. // APPLICATION OBJECT  and  MAIN
  185. //
  186. int main(int argc, const char* argv[])
  187. {
  188.     return CTest().AppMain(argc, argv, 0, eDS_Default, 0);
  189. }
  190. /*
  191.  * ===========================================================================
  192.  * $Log: test_ncbidll.cpp,v $
  193.  * Revision 1000.2  2004/06/01 19:10:03  gouriano
  194.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.11
  195.  *
  196.  * Revision 6.11  2004/05/14 13:59:51  gorelenk
  197.  * Added include of ncbi_pch.hpp
  198.  *
  199.  * Revision 6.10  2003/11/19 13:51:20  ivanov
  200.  * GetEntryPoint() revamp
  201.  *
  202.  * Revision 6.9  2002/07/01 16:45:03  ivanov
  203.  * Darwin specific with leading underscores in entry names moved to
  204.  * CDll::x_GetEntryPoint() function
  205.  *
  206.  * Revision 6.8  2002/06/26 18:58:00  lebedev
  207.  * Darwin specific: use underscores in libdl calls in test_ncbidll
  208.  *
  209.  * Revision 6.7  2002/04/16 18:49:08  ivanov
  210.  * Centralize threatment of assert() in tests.
  211.  * Added #include <test/test_assert.h>. CVS log moved to end of file.
  212.  *
  213.  * Revision 6.6  2002/04/01 18:55:41  ivanov
  214.  * Using ASSERT in stead VERIFY
  215.  *
  216.  * Revision 6.5  2002/03/25 17:08:18  ucko
  217.  * Centralize treatment of Cygwin as Unix rather than Windows in configure.
  218.  *
  219.  * Revision 6.4  2002/03/22 20:00:44  ucko
  220.  * Tweak to build on Cygwin.  (Still doesn't run successfully. :-/)
  221.  *
  222.  * Revision 6.3  2002/01/17 15:50:48  ivanov
  223.  * Added #include <windows.h> on MS Windows platform
  224.  *
  225.  * Revision 6.2  2002/01/16 18:47:44  ivanov
  226.  * Added new constructor and related "basename" rules for DLL names. Polished source code.
  227.  *
  228.  * Revision 6.1  2002/01/15 19:09:20  ivanov
  229.  * Initial revision
  230.  *
  231.  * ===========================================================================
  232.  */