标准动态dll编写和调用

本文详细介绍了如何在Windows环境下编写和调用动态链接库(DLL)。内容包括DLL的创建过程和两种调用方式:隐式调用与显示调用。对于开发者来说,掌握DLL技术能有效实现代码复用和模块化开发。

DLL的编写:

#include "stdio.h"
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{   
	switch(ul_reason_for_call)
	{

	case DLL_PROCESS_ATTACH:  // 被进程加载时,响应一次
		{
			MessageBox(NULL, "DLL被成功加载", ":)", MB_ICONINFORMATION);
			break;
		}		
	case DLL_PROCESS_DETACH:  // 进程关闭时,就会响应一次.
		{
			MessageBox(NULL, "DLL被成功卸载", ":)", MB_ICONINFORMATION);
			break;
		}		
	case DLL_THREAD_ATTACH:  // 创建纯程时,响应一次
		{
			MessageBox(NULL, "创建了一次线程", ":)", MB_ICONINFORMATION);
			break;
		}		
	case DLL_THREAD_DETACH:  // 线程返回时/结束时 响应一次
		{
			MessageBox(NULL, "线程返回或结束", ":)", MB_ICONINFORMATION);
			break;
		}
	}
    return TRUE;
}


// C编译 可以显示友好函数名 extern "C"
// C++编译 显示函数名为乱码 为了支持函数重载 等
// _declspec(dllexport) 导出一个函数
extern "C" _declspec(dllexport) VOID HelloKItty()
{
	::MessageBox(NULL, "标准DLL测试", "测试", MB_ICONINFORMATION);
}

_declspec(dllexport) int add(int a ,int b)
{	
	return a+b;
}
//导出函数也可在工程内新建一个def文件,在其内关键字后声明导出函数
//def文件内导出的函数函数名为友好无乱码



DLL的调用:

1.隐式调用:

#include "stdafx.h"
#include "stdio.h"

#pragma comment(lib,"test.lib")
extern "C"_declspec(dllimport) int HelloKItty();
_declspec(dllimport)int add(int a ,int b);
int main(int argc, char* argv[])
{
	printf("%d\n",add(1,9));
    HelloKItty();
	return 0;
}
//1.把dll的lib文件放入工程目录,dll程序放到debug目录下
//2.用关键字#pragma comment链接lib文件
//3.用关键字_declspec(dllimport)声明导入函数
//4.注:即dll的导出函数与exe的导入函数风格要一致,否则出错。导出时用c风格,导入时也用c风格



2.显示调用:

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
//用工具查看dll的函数名
//?add@@YAHHH@Z
//HelloKItty
typedef int (*add)(int a,int b);
typedef void (*hellokitty)();
int main(int argc, char* argv[])
{
    HMODULE hmod=LoadLibrary("test.dll");
	add ok=(add)GetProcAddress(hmod,"?add@@YAHHH@Z");//此处名字为你找到的名字
	int i=ok(6,6);
	printf("%d\n",i);
	hellokitty ok1=(hellokitty)GetProcAddress(hmod,"HelloKItty");
	ok1();
	FreeLibrary(hmod);//释放dll
	return 0;
}





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值