動態鏈接庫(從DLL中導出C++類)

         以Dll1爲例,打開Dll1工程,在Dll1.h文件中添加如下代碼:

  class Dll1_API Point
{
public:
    void output(int x,int y);
};

        爲了從動態鏈接庫中導出一個類,需要在class和類名之間加入導出標識符,這樣就可以導出整個類了。如果該類的某個函數訪問權限是private,那麼外部程序仍無法訪問該函數。


         接下來,在Dll1.cpp文件中實現Point這個類中的成員函數:output

void Point::output(int x,int y)
{
    //返回調用者進程當前正在使用的那個窗口的句柄
    HWND hwnd=GetForegroundWindow();
    //獲取DC
    HDC hdc=GetDC(hwnd);
    char buf[20];
    memset(buf,0,20);
    sprintf(buf,"x=%d,y=%d",x,y);
    //輸出座標
    TextOut(hdc,0,0,buf,strlen(buf));
    //釋放DC
    ReleaseDC(hwnd,hdc);
}

         Windows API提供的GetForegroundWindow函數將返回前景窗口的句柄,這個前景窗口就是當前用戶正在使用的那個程序窗口。在上述代碼中,通過調用GetForegroundWindow函數,獲得調用者進程當前正在使用的那個窗口的句柄。對於此例來說,Dll1.dll的客戶端程序就是DllTest程序。於是調用GetForegroundWindow函數後得到的就是DllTest程序主對話框窗口的句柄。

        得到了窗口句柄之後,該窗口的DC也就得到了(通過調用GetDC函數得到)。之後定義了一個字符緩衝區(buf),並通過調用memset函數將該字符數組中的元素都置爲0。然後調用sprintf函數將座標(x,y)格式化到該數組中。最後,就可以調用TextOut函數在窗口(0,0)位置處輸出座標了。通過調用ReleaseDC函數釋放設備句柄。

        因爲以上代碼中用到了Windows API函數,所以程序需要包含相應的頭文件:windows.h。還需要包含C語言的標準輸入/輸出頭文件:stdio.h。所以要在Dll1.cpp中添加以下代碼:

#include <windows.h>
#include <stdio.h>

        然後生成Dll1動態鏈接庫,並將生成的動態鏈接庫文件:Dll1.dll和引入庫文件:Dll1.lib複製到測試工程:DllTest所在目錄下。如果採用隱式鏈接方式加載dll,一旦Dll1.dll更新了,一定要將新的Dll1.dll和Dll1.lib文件複製到測試工程下。


        爲了測試新生成的dll,接下來打開DllTest工程,在對話框再增加一個按鈕,其ID屬性爲IDC_BTN_OUTPUT,Caption屬性設置爲:Output,然後雙擊該按鈕,爲該按鈕添加鼠標單擊命令響應函數:OnBtnOutput,並添加如下代碼:

void CDllTestDlg::OnBtnOutput()
{
    // TODO: Add your control notification handler code here
    Point pt;
    pt.output(5,3);
}


此時測試結果如下:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章