• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • VC++.NET中定義和使用MFC DLL

    發表于:2007-05-25來源:作者:點擊數: 標簽:VC++.NET中定義和MFCdll
    什么是DLL? DLL指的是動態鏈接庫(Dynamic Link Library),它是一個可以被多個應用程序(甚至是不同語言編寫的應用程序)同時調用的可執行二進制文件,是一個可共享的庫。DLL是建立在客戶/ 服務器 通信的概念上,包含若干函數、類或資源的庫文件,函數和數
    什么是DLL?

      DLL指的是動態鏈接庫(Dynamic Link Library),它是一個可以被多個應用程序(甚至是不同語言編寫的應用程序)同時調用的可執行二進制文件,是一個可共享的庫。DLL是建立在客戶/服務器通信的概念上,包含若干函數、類或資源的庫文件,函數和數據被存儲在一個DLL(服務器)上并由一個或多個客戶導出而使用,這些客戶可以是應用程序或者是其它的DLL。

      在下面我們將通過一個具體的例子來說明如何利用VC.Net定義一個DLL文件,并且在VC.Net的應用程序中調用,這個例子的主要功能是通過DLL獲取系統的機器名、操作系統類型和IP地址。

      在VC.Net中定義DLL文件

      選擇VC.Net菜單項,選擇文件->新建->項目,在彈出的新建項目的對話框中,選擇項目類型為Visual C++ 項目,類別為MFC的工程,在右邊的模板中,選擇MFC DLL模板,給項目取名為TestDLL,選擇好項目的位置,按確定健,進入應用程序設置。
     


      在應用程序設置中,我們可以看到,有三種DLL類型,它們依次對應著三類DLL。



      靜態DLL與共享DLL的區別是:前者使用的是MFC的靜態鏈接庫,生成的DLL文件長度大,一般不使用這種方式,后者使用MFC的動態鏈接庫,生成的DLL文件長度??;動態鏈接到MFC的共享DLL所有輸出的函數應該以如下語句開始(用于正確切換MFC模塊狀態): AFX_MANAGE_STATE(AfxGetStaticModuleState( )) 擴展DLL用來建立MFC的派生類,只被用MFC類庫所編寫的應用程序調用。常規DLL(包括靜態與動態)的一個特點是在源文件里有一個繼承CWinApp的類(從CWinApp派生,但沒有消息循環),被導出的函數是C++類或者C++成員函數,調用常規DLL的應用程序不必一定是MFC應用程序。擴展DLL和常規DLL不一樣,它沒有一個從CWinApp繼承而來的類的對象,編譯器默認了一個DLL入口函數DLLMain()作為對DLL的初始化。

      另外還可以添加兩個附加功能:自動化windows套接字,如果選擇了這兩項,程序會做一些初始化,在這里我們就不做討論了。

      在這個例子里,我們選擇“使用共享的MFC DLL”。

      添加代碼:

      1、在工程中導入systeminfo.cpp和systeminfo.h文件,這兩個文件用來獲取本機的機器名,操作系統版本和本機IP列表,具體的定義,請參考源文件。

      在TestDLL.h頭文件中,引入systemInfo.h頭文件

    #include "systemInfo.h"

      添加變量:

    CSystemInfo m_SystemInfo;

      2、在CTestDLLApp類中添加三個函數用戶獲取信息:

       //機器名
    char* GetHostName(void);
    //系統類型
    char* GetSystemType(void);
    //IP地址
    void GetIPAddressList(char ** lpIPList,DWORD *lpNumber);
      函數定義如下:
    //機器名
    char* CTestDLLApp::GetHostName(void)
    {
    char* lpsz = new char[1024];
    m_SystemInfo.GetHostName(lpsz);
    return lpsz;
    }
    //系統類型
    char* CTestDLLApp::GetSystemType(void)
    {
    char* lpsz = new char[1024];
    m_SystemInfo.GetlSystemType(lpsz);
    return lpsz;
    }
    //IP地址
    void CTestDLLApp::GetIPAddressList(char ** lpIPList,DWORD *lpNumber)
    {
    m_SystemInfo.GetIPAddressList(lpIPList,lpNumber);
    }
      3、添加輸出函數:

      打開TestDLL工程中的“TestDLL.cpp”文件,在:
    // 唯一的一個 CTestDLLApp 對象
    CTestDLLApp theApp;

    的后面添加輸出的DLL函數,函數定義如下:

    /******************* 在這里添加輸出函數 ***************************/
    /********************************************
    函數名稱:GetHostName
    功能:獲取本機的機器名稱
    返回:strHostName-本機機器名稱
    *********************************************/
    extern "C" _declspec(dllexport) void GetHostName(LPTSTR strHostName )
    {
    //如果是傳遞字符串需要使用strcpy拷貝字符串的地址,而不能直接等于。
    strcpy(strHostName,theApp.GetHostName());
    }
    /********************************************
    函數名稱:GetSystemType
    功能:獲取本機操作系統版本
    返回:strSystemType-本機操作系統版本
    *********************************************/
    extern "C" _declspec(dllexport) void GetSystemType(char * strSystemType)
    {
    strcpy(strSystemType,theApp.GetSystemType());
    }
    /********************************************
    函數名稱:GetIPAddressList
    功能:獲取本機的IP地址
    返回:lpIPList-本機的IP地址數組,lpNumber IP地址個數
    *********************************************/
    extern "C" _declspec(dllexport) void GetIPAddressList(char ** lpIPList,DWORD *lpNumber)
    {
    theApp.GetIPAddressList(lpIPList,lpNumber);
    }
      最后編譯工程文件,生成TestDLL.dll文件。

      至此,一個DLL文件已經做好了。



      在VC.Net中使用DLL文件

      新建一個基于對話框的VC.Net工程DemoTestDLL,界面如下圖(運行結果圖):



      為了讓DemoTestDLL能夠調用TestDLL.dll程序,需要讓前者能夠"看見" DLL程序。我們將TestDLL.dll文件考到DemoTestDLL的Debug目錄下,一個Windows程序定位DLL的次序是:

      1、 包含EXE文件的目錄。

      2、 進程的當前工作目錄。

      3、 Windows系統目錄。

      4、 Windows目錄。

      5、 列在Path環境變量中的一系列目錄。

      在測試DLL按鈕添加下面代碼:

    void CDemoTestDLLDlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知處理程序代碼
    //聲明DLL函數
    typedef void (_cdecl *GETHOSTNAME)(LPTSTR strHostName);
    typedef void (_cdecl *GETSYSTEMTYPE)(char * strSystemType);
    typedef void (_cdecl *GETIPADDRESSLIST)(char ** lpIPList,DWORD *lpNumber);

    //聲明函數句柄
    HMODULE hTestDLL = NULL;
    GETHOSTNAME GetHostName = NULL;
    GETSYSTEMTYPE GetSystemType = NULL;
    GETIPADDRESSLIST GetIpAddressList = NULL;

    // 加載動態鏈接庫
    hTestDLL = LoadLibrary("TestDLL.dll");
    if(hTestDLL == NULL)\
    {
    printf("cannot load LCDDLL.dll\n");
    exit(0);
    }

    /*** 找到每個函數的入口 ****/
    //系統名稱
    GetHostName = (GETHOSTNAME)GetProcAddress(hTestDLL,"GetHostName");
    if(GetHostName==NULL)
    {
    printf("cannot load process GetHostName\n");
    FreeLibrary(hTestDLL);
    exit(1);
    }

    //操作系統類型
    GetSystemType = (GETSYSTEMTYPE)GetProcAddress(hTestDLL,"GetSystemType");
    if(GetSystemType==NULL)
    {
    printf("cannot load process GetSystemType\n");
    FreeLibrary(hTestDLL);
    exit(1);
    }

    //IP地址列表
    GetIpAddressList = (GETIPADDRESSLIST)GetProcAddress(hTestDLL,"GetIPAddressList");
    if(GetSystemType==NULL)
    {
    printf("cannot load process GetIpAddressList\n");
    FreeLibrary(hTestDLL);
    exit(1);
    }

    /*** 使用LPTSTR和使用char*定義的效果是一樣的 ***/

    //取機器名稱
    LPTSTR szHostName = new char[1024];
    (*GetHostName)(szHostName);

    //取操作系統類型
    char* szSystemType = new char[1024];
    (*GetSystemType)(szSystemType);

    //IP Address List
    DWORD ipListNumber = 0;
    //聲明方式一
    //LPTSTR* lpAddress = new LPTSTR[256];
    //聲明方式二
    char** lpAddress = new char*[256];
    for(int i=0;i<256;i++)
    {
    lpAddress[i] = NULL;
    }
    (*GetIpAddressList)(lpAddress,&ipListNumber);

    //顯示在界面
    m_setHostName.SetWindowText(szHostName);
    m_setSystemType.SetWindowText(szSystemType);

    //將IP添加到list 中
    for(int i=0;i<ipListNumber;i++)
    {
    m_IPList.AddString(lpAddress[i]);
    }
    }
      編譯運行的結果如上圖所示。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>