有一些东西是一定要动手实现的,学习有的点可以慢慢积累,但是有一些基本的盲区是一定不要跨过去的。
这里不过多的讲解Dll的内容,只是记录一下常用的两种dll编写方法。
一. Dll的编写
第一种方法:
首先打开vs2010---> win32 application--->选择一个dll工程(MyDll)---->不要选择空项目,让它帮你生产dllmain函数入口。你熟悉以后也可以自己写。
// dllmain.cpp
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
第一种方式使用 extern "C" _declspec(dllexport)的方式,我们以 加减法为例子:
// MyDll.cpp
extern "C" _declspec(dllexport) int Max(int a, int b);
extern "C" _declspec(dllexport) int Min(int a, int b);
int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
int Min(int a, int b)
{
if(a>=b)return b;
else
return a;
}
第二种方式:
(1)去掉 以下申明
//extern "C" _declspec(dllexport) int Max(int a, int b);
//extern "C" _declspec(dllexport) int Min(int a, int b);
(2)在Min,Max函数前面加上 extern "c" ,导出函数一定要按这种方式来写,避免调用错误。
extern "c" int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
extern "c" int Min(int a, int b)
{
if(a>=b)return b;
else
return a;
}
(3) 添加.def文件,在该文件中写明输出函数(由于我的vs不能自动添加,因为我在本地手动创建了一个.def文件,并在工程配置属性Link-->Input--->Module Definition File中配置.def文件名称)
;
; Cmpnt1 module-definition file
;
LIBRARY MyDll.dll
DESCRIPTION '(c)1996-1997 Dale E. Rogerson'
EXPORTS
Min @1 PRIVATE
Max @2 PRIVATE
直接Build工程即可在目录下生成相应的.lib和.dll文件。
二. Dll的调用
(1) 隐式链接。
隐式链接就是在程序开 始执行时就将 DLL文件加载到应用程序当中。只要将导入函数关键字 _declspec (dllimport) 函数名等写到应用程序相的头文件中就可 以了。这种方法需要把.lib文件也拷贝到你的测试工程下。
#pragma comment(lib,"Messagebox.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
#include <windows.h>
#include<stdio.h>
int main()
{
int a;
a=Max(8,10);
printf("比较的结果为%d\n",a);
a=Min(8,10);
printf("比较的结果为%d\n",a);
return 0;
}
(2)动态链接
动态链接不需要拷贝.lib文件到测试工程目录。动态链接是在程序中动态加载,动态卸载,这样可以减少内存使用。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来。然后再用GetProcAddress()获取想要引入的函数。程序退出时使用FreeLibrary或AfxFreeLibrary释放动态链接库。
/*
注意:要将之前的MyDll.dll拷贝到工程目录哦,不需要拷贝lib
*/
#include<windows.h>
#include<stdio.h>
void main(void)
{
//使用类型定义关键字定义指向DLL中相同的函数原型指针
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;//声明一个DLL实例文件句柄
pMax Max;
int a=0;
hDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");//获取导入到应用程序中的函数指针
a=Max(5,8);
printf("比较的结果为%d\n",a);
FreeLibrary(hDLL);//卸载MyDll.dll文件;
}
参考:见附件!