以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);
}
此时测试结果如下: