dll使用有2种方式,一种是显式链接,一种是隐式链接。说得直白一些,显示链接需要在程序代码中调用dll文件,而隐式链接只需要包含相应的头文件。
下面是一个简单的win32程序调用函数的例子,实现了2个数相加的功能,调用变量和类的方法也差不多。
首先,无论显示隐式,dll项目都是一样的。新建一个win32 Dynamic-Link Library工程,命名为DLLsample好了,工程中原有的代码不去管它,一些关键字的解释很多地方都有详细的说明,先在Dllsample.h头文件中添加函数声明,extern "C" __declspec(dllexport) int add(int a,int b); (extern "C"貌似可以省略?),在cpp中实现这个函数,return (a+b);
OK,编译完成,很简单吧。
再说怎么调用,先说显式链接。新建一个"hello world"控制台工程,把刚才dll工程下的Dllsample.dll拷贝到该工程的Debug目录下,添加下列代码
#include "stdafx.h"
#include <windows.h>
typedef (/*_stdcall*/ *DllAddMath)(int,int);
int main(int argc, char* argv[])
{
HINSTANCE hdll = ::LoadLibrary("Dllsample.dll"); //载入dll
//获取dll的函数指针,并强制转换为先前typedef的函数指针
DllAddMath dllMath=(DllAddMath)::GetProcAddress(hdll,"add"); //找到DLL中add函数的地址,我是这么理解的。。。
int c=0;
c=dllMath(1,2);
printf("1+2=%d",c);
::FreeLibrary(hdll);//释放DLL
return 0;
}
运行下试试。
然后是隐式链接,同样新建一个"hello world"控制台工程,把之前dll工程下的Dllsample.dll拷贝到该工程的Debug目录下,把Dllsample.h和Dllsample.lib拷贝到该工程的根目录下。其次,在hello world工程中添加Dllsample.h头文件,cpp文件中包含该头文件,在project->setting->link->Object/library modules中添加Dllsample.lib,以下是代码:
#include "Dllsample.h"
int main(int argc, char* argv[])
{
int c=0;
c=add(1,2);
printf("1+2=%d",c);
return 0;
}
That's all
动态链接库基础(笔记)
最新推荐文章于 2018-09-30 23:27:49 发布