1.
利用
MFC AppWizzed(DLL)
向导界面创建一个动态链接库工程
,
向导中的各个选项不变
.
2.
在
DLL
主程序文件中定义几个函数
,
供其他程序调用
,
函数的声明必须有下面的的关键字
:
extern "C" TYPE PASCAL EXPORT FunName()
每个函数体的第一句话必须是
:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
如下例
:
extern "C" int PASCAL EXPORT TestFun()<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return 8;
}
3.
每个显式调用的动态链接库工程都必须包含一个模块定义文件
,
即
DEF
文件
,
在模块定义文件中必须对外部调用者说明库内函数的名称
,
书写格式如下
:
TestFun @1
如
:
; S12.def : Declares the module parameters for the DLL.
LIBRARY "S12"
DESCRIPTION 'S12 Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
TestFun @1
如果有多个函数
,
则编号从
@1
开始
,
不要从
@0
开始
.
调用
:
显式调用的动态链接库必须使用
LoadLibrary()
函数装载
,
因此叫做显式调用
.
1.
利
MFC AppWizzed(exe)
向导界面创建一个普通的
project
2.
在实施调用的
CPP
文件的顶部定义函数指针类型
,
定义方法
:
typedef TYPE (CALLBACK* FUNPOINTER1)(param list);
3.
在调用点声明函数指针
,
声明方法
:
FUNPOINTER1 lpfnDllFunc1;
4.
用
LoadLibrary()
装载动态链接库
.
5.
用
GetProcAddress()
装载函数
,
装载方法
;
lpfnDllFunc1 = (FUNPOINTER1)GetProcAddress(“TestFun”);
6.
调用装载进来的函数
:
lpfnDllFunc1();
如
:
BOOL CTestDllApp::TestDll()
{
HINSTANCE hDll;
FUNPOINTER1 lpfnDllFunc1;
FUNPOINTER2 lpfnDllFunc2;
UINT uReturnVal;
hDll = LoadLibrary("E:\\S12.dll");//
装载动态连接库
if(hDll != NULL)
{
lpfnDllFunc1 = (FUNPOINTER1)GetProcAddress(hDll,"TestFun");//
装载函数
if(!lpfnDllFunc1)
{
FreeLibrary(hDll);
return FALSE;
}
else
{
int n;
n = lpfnDllFunc1();//
调用函数
}
}
return TRUE;
}
转载于:https://blog.51cto.com/orajc/99307