首先声明,我是初学者,绝对的初学,所以有什么不对或者不好的地方,欢迎指正。
我的环境:Windows XP SP2 Professional + Visual Studio 2005 SP1
首先,我的建议是在若是为了MFC程序写DLL最好在创建时勾选MFC支持,使用win32程序的DLL而非什么MFC DLL
.dll的编写与普通C/C++程序没有太大的区别,包括一个.h文件和.cpp文件。.h文件中声明函数、类,.cpp文件中实现函数和类。要注意的是在函数/类名前添加declspec(dllexport) 修饰导出和declspec(dllimport) 修饰导入,用于声明该函数/类用于导出
函数的写法: declspec(dllexport) int demo(int, int);
类的写法: class
declspec(dllexport) demo
{
// TODO: 在此添加类体
};
注意,当写一个导出函数时,.cpp中的函数名前方也需要增加declspec(dllexport)
但有的时候我们需要在一个DLL中引用另一个DLL中的函数、类,就需要用到declspec(dllimport)了。在这里,VC给我们提供的方便是通过以下方式避免导入,导出的使用判定。
#ifdef COREDLL_EXPORTS
#define COREDLL_API declspec(dllexport)
#else
#define
COREDLL_API
declspec(dllimport)
#endif
通过条件编译的方式回避这一问题,为我们提供方便。
那么,接下来是DLL的使用。对于通过编译的DLL,我们一共需要三个文件用于载入,分别是DLL的.h文件,DLL文件以及.lib文件。
使用分两种方法,分别是动态载入和静态载入。
静态载入:适合于在程序中需要大量调用的DLL,只需要在调用的程序头部加入
#include
"DLL_h.h"
#pragma
comment(lib,"DLL.lib")
后,按照普通的使用函数或类的方法使用DLL中的函数或类就可以了
动态载入:适合于小规模使用
//定义一个函数指针
typedef
void ( DLLWITHLIB )(void);
//定义一个函数指针变量
DLLWITHLIB pfFuncInDll = NULL;
//加载dll
HINSTANCE hinst=::LoadLibrary("dll_def.dll");
//找到dll的FuncInDll函数
pfFuncInDll = (DLLWITHLIB)GetProcAddress(hinst, "FuncInDll"); //Function Name
//调用dll里的函数
(pfFuncInDll)();
重要的提醒:初学者切记数据类型的使用,如char,建议全部换用wchar_t,否则当你的DLL载入到MFC界面中使用时会有一大堆的数据类型转换的麻烦
最后,提供两篇参考的文章
DLL编写教程
MFC DLL 向导(摘)
OVER!!!JJJ