动态链接库(从DLL中导出C++类)

本文介绍如何使用动态链接库(DLL)在Windows程序中输出坐标信息,包括类定义、成员函数实现及DLL的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         以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);
}


此时测试结果如下:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值