导出函数声明
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)();
}