生成DLL的几种方法和使用方法

1.用__declspec (dllexport) 约定来导出DLL函数
建立一个EDRLIB动态连接库项目:
/*EDRLIB.h文件*/
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)   //如是 C++编译则用extern"C"限制其为C模式编译
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT BOOL CALLBACK EdrCenterText (HDC, PRECT, PCSTR) ;
EXPORT BOOL CALLBACK MsgBox (PCSTR);

/*EDRLIB.C文件*/

#include <windows.h>
#include "edrlib.h"
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)

{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH://DLL被加载
MessageBox(0,"DLL正被加载 !","DllMessage",0);
break;
case DLL_PROCESS_DETACH:
MessageBox(0,"进程将要退出!","DllMessage",0);
break;
default:
break;
}
return TRUE ;
}
EXPORT BOOL CALLBACK EdrCenterText(HDC hdc, PRECT prc, PCSTR pString)
{
int iLength ;

SIZE size ;
char cstr[20];
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 BOOL CALLBACK MsgBox (PCSTR pString)
{
MessageBox(0,pString,"DllMessage",0);
return TRUE;

}
这样就生成了一个EDRLIB.lib,EDRLIB.dll
在项目中使用:
1.1通过EDRLIB.lib引用连接库来使用
     EDRLIB.lib放置到settings->Link->Input->Object/libary modules中,并设置Additional library Path路径正确.
代码如下 :
/*test.c文件*/
#include "stdafx.h"
#include "../edrlib/EDRLIB.h"   //引用头文件
/*省略一些代码*/
EdrCenterTextA (hdc, &rect,TEXT ("调用DLL接口输出信息")) ;//可以直接使用该函数
/*省略一些代码*/

1.2通过LoadLibrary来动态加载,但这里请用DLL函数查看器,看清楚DLl对外提供的函数接口名.
/*test.c文件*/
#include "stdafx.h"
#include "resource.h"
typedef BOOL (__stdcall* EdrCenterTextA)(HDC,PRECT,PCSTR); //定义数据类型
typedef BOOL (__stdcall* MsgBox)(PCSTR);
/*省略一些代码*/
HMODULE hDllLib = LoadLibrary("EDRLIB.dll");//加载成功
EdrCenterTextA EdrCenterText2 = (EdrCenterTextA)GetProcAddress(hDllLib,"_EdrCenterText@12");
EdrCenterText2(hdc, &rect,"hello") ;
FreeLibrary(hDllLib);
/*省略一些代码*/

2.用*.def文件导出Dll函数
*.def文件说明:http://msdn.microsoft.com/zh-cn/library/28d6s79h(VS.80).aspx

/*EDRLIB.h文件*/
#ifdef __cplusplus
#define EXPORT extern "C"    //如是 C++编译则用extern"C"限制其为C模式编译
#else
#define EXPORT
#endif
EXPORT BOOL EdrCenterText (HDC, PRECT, PCSTR) ;
EXPORT BOOL MsgBox (LPCTSTR);

/*EDRLIB.def文件*/
LIBRARY         EDRLIB.dll
DESCRIPTION     '(c)2008-2009 yan'
version '1.0.0.1'
EXPORTS
MsgBox @1 PRIVATE
EdrCenterText @2 PRIVATE

我们可以通过1.1的方法来使用,但是要把EDRLIB.def文件引用到Test使用项目中去,Project->SETTINGS->lINK ->Projcet Options    加入/DEF:EDRLIB.def

]深入浅出Visual C++动态链接库(Dll)编程:http://langzi0115.bokee.com/6508109.html

你可能感兴趣的:(dll)