WEB开发网
开发学院软件开发VC MFC DLL向导(一) 阅读

MFC DLL向导(一)

 2010-05-27 20:37:40 来源:WEB开发网   
核心提示:3、导出函数导出函数和导出变量/对象类似,只要把_declspec(dllexport)加到函数原型开始的位置:_declspec(dllexport) int MyFunction(int);如果是常规DLL,MFC DLL向导(一)(2),它将和C写的程序使用,声明方式如下:extern "c"

3、导出函数

导出函数和导出变量/对象类似,只要把_declspec(dllexport)加到函数原型开始的位置:

_declspec(dllexport) int MyFunction(int);

如果是常规DLL,它将和C写的程序使用,声明方式如下:

extern "c" _declspec(dllexport) int MyFunction(int);

实现:

extern "c" _declspec(dllexport) int MyFunction(int x)
{
...//操作
}

如果创建的是动态连接到MFC代码库DLL的常规DLL,则必须插入AFX_MANAGE_STATE作为导出函数的首行,因此定义如下:

extern "c" _declspec(dllexport) int MyFunction(int x)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
...//操作
}

有时候为了安全起见,在每个常规DLL里都加上,也不会有任何问题,只是在静态连接的时候这个宏无效而已。这是导出函数的方法,记住只有MFC扩展DLL才能让参数和返回值使用MFC的数据类型。

4、导出指针

导出指针的方式如下:

_declspec(dllexport) int *pint;
_declspec(dllexport) CMyClass object = new CMyClass;

如果声明的时候同时初始化了指针,就需要找到合适的地方类释放指针。在扩展DLL中有个函数DllMain()。(注意函数名中的两个l要是小写字母),可以在这个函数中处理指针:

# include "MyClass.h"
_declspec(dllexport) CMyClass *pobject = new CMyClass;
DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
.....//
}
else if(dwReason == DLL_PROCESS_DETACH)
{
delete pobject;
}
}

常规DLL有一个从CWinApp派生的类对象处理DLL的开和关,可以使用类向导添加InitInstance/ExITInstance函数。

int CMyDllApp::ExITInstance()
{
delete pobject;
return CWinApp::ExITInstance();
}

三、在客户程序中使用DLL

编译一个DLL时将创建两个文件.dll文件和.lib文件。首先将这两个文件复制到客户程序项目的文件夹里,这里需要注意DLL和客户程序的版本问题,尽量使用相同的版本,都使用RELEASE或者都是DEBUG版本。

接着就需要在客户程序中设置LIB文件,打开Project Settings--->Link--->Object/library Modules中输入LIB的文件名和路径。如:Debug/SampleDll.lib。除了DLL和LIB文件外,客户程序需要针对导出类、函数、对象和变量的头文件,现在进行导入添加的关键字就是:_declspec(dllimport),如:

_declspec(dllimport) int MyFunction(int);
_declspec(dllimport) int MyInt;
_declspec(dllimport) CMyClass object;
extern "C" _declspec(dllimport) int MyFunction(int);

在有的时候为了导入类,要把相应类的头文件添加到客户程序中,不同的是要修改类声明的标志:

class _declspec(dllimport) CMyClass,如果创建的是扩展DLL,两个位置都是:

class AFX_EXT_CLASS CMyClass。

上一页  1 2 

Tags:MFC DLL 向导

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接