⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_ncbidll.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: test_ncbidll.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:10:03  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.11 * PRODUCTION * =========================================================================== *//*  $Id: test_ncbidll.cpp,v 1000.2 2004/06/01 19:10:03 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Author: Vladimir Ivanov * * File Description: *   Portable DLL handling test * Note: *   This test use simple DLL (coremake/test/test_dll). It must be compiled  *   and copied to project's directory before run the test. * */#include <ncbi_pch.hpp>#include <corelib/ncbiapp.hpp>#include <corelib/ncbiargs.hpp>#include <corelib/ncbidll.hpp>#include <test/test_assert.h>  /* This header must go last */USING_NCBI_SCOPE;/////////////////////////////////// // Common CDll test//static void s_TEST_SimpleDll(void){    CDll dll("./","test_dll", CDll::eLoadLater);    // Load DLL    dll.Load();    // DLL variable definition    int*    DllVar_Counter;    // DLL functions definition        int     (* Dll_Inc) (int) = NULL;    int     (* Dll_Add) (int, int) = NULL;    string* (* Dll_StrRepeat) (const string&, unsigned int) = NULL;    // Get addresses from DLL    DllVar_Counter = dll.GetEntryPoint_Data("DllVar_Counter", &DllVar_Counter);    if ( !DllVar_Counter ) {        ERR_POST(Fatal << "Error get address of variable DllVar_Counter.");    }    Dll_Inc = dll.GetEntryPoint_Func("Dll_Inc", &Dll_Inc );    if ( !Dll_Inc ) {        ERR_POST(Fatal << "Error get address of function Dll_Inc().");    }    Dll_Add = dll.GetEntryPoint_Func("Dll_Add", &Dll_Add );    if ( !Dll_Add ) {        ERR_POST(Fatal << "Error get address of function Dll_Add().");    }    Dll_StrRepeat = dll.GetEntryPoint_Func("Dll_StrRepeat", &Dll_StrRepeat );    if ( !Dll_StrRepeat ) {        ERR_POST(Fatal << "Error get address of function Dll_StrRepeat().");    }    // Call loaded function    assert( *DllVar_Counter == 0  );    assert( Dll_Inc(3)      == 3  );    assert( *DllVar_Counter == 3  );    assert( Dll_Inc(100)    == 103);    assert( *DllVar_Counter == 103);    *DllVar_Counter = 1;    assert( Dll_Inc(0)      == 1  );    assert( Dll_Add(3,4)    == 7  );    assert( Dll_Add(-2,-1)  == -3 );        string* str = Dll_StrRepeat("ab",2);    assert( *str == "abab");    str = Dll_StrRepeat("a",4);      assert( *str == "aaaa");    // Unload used dll    dll.Unload();}/////////////////////////////////// //  Load windows systems DLL//static void s_TEST_WinSystemDll(void){#if defined NCBI_OS_MSWIN    CDll dll_user32("USER32", CDll::eLoadLater);    CDll dll_userenv("userenv.dll", CDll::eLoadNow, CDll::eAutoUnload);    // Load DLL    dll_user32.Load();    // DLL functions definition        BOOL (STDMETHODCALLTYPE FAR * dllMessageBeep)             (UINT type) = NULL;    BOOL (STDMETHODCALLTYPE FAR * dllGetProfilesDirectory)             (LPTSTR  lpProfilesDir, LPDWORD lpcchSize) = NULL;    // This is other variant of functions definition    //    // typedef BOOL (STDMETHODCALLTYPE FAR * LPFNMESSAGEBEEP) (    //     UINT uType    // );    // LPFNMESSAGEBEEP  dllMessageBeep = NULL;    //    // typedef BOOL (STDMETHODCALLTYPE FAR * LPFNGETPROFILESDIR) (    //     LPTSTR  lpProfilesDir,    //     LPDWORD lpcchSize    // );    // LPFNGETUSERPROFILESDIR  dllGetProfilesDirectory = NULL;    dllMessageBeep = dll_user32.GetEntryPoint_Func("MessageBeep", &dllMessageBeep );    if ( !dllMessageBeep ) {        ERR_POST(Fatal << "Error get address of function MessageBeep().");    }    // Call loaded function    dllMessageBeep(-1);    #ifdef UNICODE    dll_userenv.GetEntryPoint_Func("GetProfilesDirectoryW", &dllGetProfilesDirectory);    #else    dll_userenv.GetEntryPoint_Func("GetProfilesDirectoryA", &dllGetProfilesDirectory);    #endif    if ( !dllGetProfilesDirectory ) {        ERR_POST(Fatal <<                 "Error get address of function GetUserProfileDirectory().");    }    // Call loaded function    TCHAR szProfilePath[1024];    DWORD cchPath = 1024;    if ( dllGetProfilesDirectory(szProfilePath, &cchPath) ) {        cout << "Profile dir: " << szProfilePath << endl;    } else {        ERR_POST(Fatal << "GetProfilesDirectory() failed");    }    // Unload USER32.DLL (our work copy)    dll_user32.Unload();    // USERENV.DLL will be unloaded in the destructor    // dll_userenv.Unload();#endif}////////////////////////////////// Test application//class CTest : public CNcbiApplication{public:    void Init(void);    int Run(void);};void CTest::Init(void){    SetDiagPostLevel(eDiag_Warning);    auto_ptr<CArgDescriptions> d(new CArgDescriptions);    d->SetUsageContext("test_dll", "DLL accessory class");    SetupArgDescriptions(d.release());}int CTest::Run(void){    cout << "Run test" << endl << endl;    // Common test    s_TEST_SimpleDll();    // Windows only extended test    s_TEST_WinSystemDll();    cout << endl;    cout << "TEST execution completed successfully!" << endl << endl;    return 0;}///////////////////////////////////// APPLICATION OBJECT  and  MAIN//int main(int argc, const char* argv[]){    return CTest().AppMain(argc, argv, 0, eDS_Default, 0);}/* * =========================================================================== * $Log: test_ncbidll.cpp,v $ * Revision 1000.2  2004/06/01 19:10:03  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.11 * * Revision 6.11  2004/05/14 13:59:51  gorelenk * Added include of ncbi_pch.hpp * * Revision 6.10  2003/11/19 13:51:20  ivanov * GetEntryPoint() revamp * * Revision 6.9  2002/07/01 16:45:03  ivanov * Darwin specific with leading underscores in entry names moved to * CDll::x_GetEntryPoint() function * * Revision 6.8  2002/06/26 18:58:00  lebedev * Darwin specific: use underscores in libdl calls in test_ncbidll * * Revision 6.7  2002/04/16 18:49:08  ivanov * Centralize threatment of assert() in tests. * Added #include <test/test_assert.h>. CVS log moved to end of file. * * Revision 6.6  2002/04/01 18:55:41  ivanov * Using ASSERT in stead VERIFY * * Revision 6.5  2002/03/25 17:08:18  ucko * Centralize treatment of Cygwin as Unix rather than Windows in configure. * * Revision 6.4  2002/03/22 20:00:44  ucko * Tweak to build on Cygwin.  (Still doesn't run successfully. :-/) * * Revision 6.3  2002/01/17 15:50:48  ivanov * Added #include <windows.h> on MS Windows platform * * Revision 6.2  2002/01/16 18:47:44  ivanov * Added new constructor and related "basename" rules for DLL names. Polished source code. * * Revision 6.1  2002/01/15 19:09:20  ivanov * Initial revision * * =========================================================================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -