以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);
}
此時測試結果如下: