龙空技术网

VC编写DLL入门实例

龙溪流 114

前言:

眼前同学们对“c编写dll文件”大约比较注重,咱们都想要学习一些“c编写dll文件”的相关文章。那么小编同时在网络上网罗了一些有关“c编写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;

}

标签: #c编写dll文件 #vc调用dll库成员函数