导出函数声明
extern “c” _declspec (dllexport)
vs创建项目时候选择win32项目,在应用程序类型里选择DLL(D)
附加选项里选择空项目
我们要建立需要的DLL文件,我们这里就取名为DLL.h,DLL.c
//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)();