如何编写dll文件(dll编写教程)
1. 利用MFC AppWizzed(DLL)向导界面创建一个动态链接库工程,向导中的各个选项不变.
2. 在DLL主程序文件中定义几个函数,供其他程序调用,函数的声明必须有下面的的关键字:
extern "C" TYPE PASCAL EXPORT FunName()
每个函数体的第一句话必须是:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
如下例:
extern "C" int PASCAL EXPORT TestFun()
{
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;
}