`

Dll入门

阅读更多

     有一些东西是一定要动手实现的,学习有的点可以慢慢积累,但是有一些基本的盲区是一定不要跨过去的。

 

     这里不过多的讲解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文件;
}

 

   参考:见附件!

    

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics