DLL创建与注入方法

导出函数声明

extern “c” _declspec (dllexport)

 

vs创建项目时候选择win32项目,在应用程序类型里选择DLL(D)

附加选项里选择空项目

 

我们要建立需要的DLL文件,我们这里就取名为DLL.h,DLL.c



一启动时候加载DLL
需要使用h文件 lib文件

//DLL.h
#ifdef  __cplusplus 	//C++
#define  EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)  //not C++
#endif

EXPORT BOOL EnterTextA(HDC hdc, PRECT prc, PCSTR pString);

EXPORT CALLBACK EnterTextW(HDC hdc, PRECT prc, PCWSTR pString);

#ifdef UNICODE
#define EnterText EnterTextW
#else
#define EnterText EnterTextA
#endif


//DLL.C
#include <Windows.h>
#include "dll.h"

int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
	return TRUE;
}
EXPORT BOOL EnterTextA(HDC hdc,PRECT prc,PCSTR pString)
{
	int iLength;
	SIZE size;

	iLength = lstrlenA(pString);
	GetTextExtentPoint32A(hdc, pString, iLength, &size);
	return TextOutA(hdc, (prc->right - prc->left - size.cx) / 2,
		(prc->bottom - prc->top - size.cy) / 2, pString,iLength);
}

EXPORT CALLBACK EnterTextW(HDC hdc, PRECT prc, PCWSTR pString)
{
	int iLength;
	SIZE size;

	iLength = lstrlenW(pString);
	GetTextExtentPoint32W(hdc, pString, iLength, &size);
	return TextOutW(hdc, (prc->right - prc->left - size.cx) / 2,
		(prc->bottom - prc->top - size.cy) / 2, pString, iLength);
}
这里的TextOutW函数是TextOut后面加W 是unicode 字符,使用双字节,可用于中日韩等国的文字.

前面头文件#ifdef  #else #endif 结构判断是否为为C++文件,判断是否使用 extern “c”


因为是DLL文件,点击vs 上面的生成就可以了,文件夹会生成 .dll  .lib 文件

我们需要复制.dll .h .lib 文件到需要DLL 的软件里去.


这里我们需要的载体软件是WIN32 格式软件,我们在消息函数WM_PAINT 里面写入我们定义的EnterText() 函数.

定义个RECTrect;

 

     GetClientRect(hWnd,&rect);

     EnterText(hdc,&rect,TEXT("thisis a dll"));

当然,在头文件里我们需要加上#include"dll.h"



当然第一种方法的麻烦程度相对还是很大的,所以我们通常使用第二种方法.


二 运行时加载DLL 

使用LoadLibrary() GetProcAddress()


DLLMain 函数是DLL 的入口函数,只能做一些简单的初始化工作.

这是DLL的入口点

// 入口点 出口点
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
	switch(fdwReason)
	{
	case DLL_PROCESS_ATTACH:	//加载程序
		MessageBox(NULL,TEXT("dll被加载了!"),TEXT("DLL"),MB_OK);
		break;
	case DLL_PROCESS_DETACH:	//释放程序
		break;
	case DLL_THREAD_ATTACH:		//新建线程
		break;
	case DLL_THREAD_DETACH:		//线程退出
		break;
	}
	return TRUE;
}

我们接着在之前做的DLL.c文件中加入下面代码


EXPORT DWORD DemoA()
{
	MessageBoxA("NULL", "这是动态链接库的函数", "DLL", MB_OK);
	return 0;
}

EXPORT DWORD DemoW()
{
	MessageBoxW("NULL", L"这是动态链接库的函数", L"DLL", MB_OK);
	return 0;
}

当调用这里面DLL文件里面函数时候,会出现  这是动态链接库的函数 的对话框.



我们把DLL 文件放入所需要的项目里面.

建立了一个MFC项目


其中导入DLL 按钮是

voidCDLLTestDlg::OnBnClickedButtonLoad()

{

   hLibrary=LoadLibrary(TEXT("DLL.dll"));

}

导入函数 按钮是

voidCDLLTestDlg::OnBnClickedButtonFunc()

{

 

   DEMOWDemoW=(DEMOW)GetProcAddress(hLibrary,"DemoW");

   DemoW();




当然,我们在前面要还要定义如下变量:

HINSTANCE  hLibrary;

typedefDWORD(*DEMOW)();


}







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值