动态链接库导出函数示例

59 篇文章 12 订阅

第一步,新建项目,选择win32项目(不是win32控制台程序),命名为ClassDll根据导向选择DLL,完成。


示例图1-1

第二步,新建一个头文件,命名为 ClassDll.h,在这个头文件里添加下面的代码:

class _declspec(dllexport) Point
{
public:
void output(int x,int y);
int Add(int a,int b);
}; 

注意:此处的 _declspec(dllexport)是标识符,用于标识导出的类Point 

第三步,新建一个用于Point类的定义的文件,命名为ClassDll.cpp,这个文件包含的全部代码如下:

#include "stdafx.h"
#include "ClassDll.h"
#include <Windows.h> 
#include <stdio.h> 
#include <tchar.h> 
void Point::output(int a ,int b)
{
//返回调用者进程当前正在使用的那个窗口的句柄
HWND hwnd=GetForegroundWindow();
//获取DC
HDC hdc=GetDC(hwnd);
char buf[20];
memset(buf,0,20);
sprintf(buf,"x=%d,y=%d",a,b);
//输出坐标
TextOut(hdc,0,0,buf,strlen(buf));
//释放DC
ReleaseDC(hwnd,hdc);
}
 
int Point::Add(int a,int b)
{
return a+b;
}
 
//用于外部主程序调用类的方法
extern "C" _declspec(dllexport) void show(int a,int b) 
{
Point pt;
pt.output(a,b);
//MessageBox(_T("测试成功!"));
}
 
//用于外部主程序调用类的方法
extern "C" _declspec(dllexport) int Add(int a,int b) 
{
return a+b;
}

第四步,到现在为止,我们已经实现了Point这个类,包含了两个方法,注意:这两个方法的参数和返回值。现在需要在新的工程中引用这个Dll文件。新建一个MFC对话框程序,工程命名为DllTest,在界面中添加一个按钮,并在此按钮中添加引用Dll的测试代码。

 

示意图4-1 

第五步,将每次更新动态链接库Debug文件中的ClassDll.dllClassDll.lib拷贝到主程序的根目录下。示意图如下:


示例图5-1

示例图5-2

注意:(动态加载动态链接库:不需要将生成动态链接库文件中的头文件加载到调用程序中,同时也不需要将.lib文件复制到调用文件的根目录下。只需要将.dll复制到调用文件的根目录下即可)

 

 

第六步,程序调用(因为动态链接库中Add函数前加入extern "C"(如上标红的代码)因此名字导出时不发生名字改编也就是不会变成?Add@@YAXHH@Z(参考Doc使用dumpbin导入数据……文档),所以在调用程序中GetProcAddress函数的参数直接写为Add(如果动态链接库中Add函数发生名字改编则调用程序中GetProcAddress参数为?Add@@YAXHH@Z))(show函数同理)

测试代码(在界面中的一个按钮消息响应函数中实现)

void CDllTestDlg::OnBtnTest()
{
HINSTANCE hInst;   //定义一个实例句柄对象
hInst=LoadLibrary(_T("ClassDll.dll"));   //动态加载Dll
typedef void (*ADDPROC1)(int a,int b);    //定义函数指针类型
ADDPROC1 Output=(ADDPROC1)GetProcAddress(hInst,"show");//调用dll类中的方法
if(!Output)
{
MessageBox(_T("获取函数地址失败"));
return;
}
Output( 90, 9);
 
typedef int (*ADDPROC)(int a,int b);    //定义函数指针类型
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"Add");//调用dll类中的方法
if (!Add)
{
MessageBox(_T("获取函数地址失败"));
return;
}
CString str;
str.Format(_T("%d"),Add(2,4));
MessageBox(str);
} 

第七步,程序执行结果:

  

图7-1 程序引用dll测试结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法哥2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值