DLL编写初体验



首先声明,我是初学者,绝对的初学,所以有什么不对或者不好的地方,欢迎指正。


我的环境: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");


//找到dllFuncInDll函数


pfFuncInDll = (DLLWITHLIB)GetProcAddress(hinst, "FuncInDll"); //Function Name


//调用dll里的函数


(pfFuncInDll)();


重要的提醒:初学者切记数据类型的使用,如char,建议全部换用wchar_t,否则当你的DLL载入到MFC界面中使用时会有一大堆的数据类型转换的麻烦


最后,提供两篇参考的文章


DLL编写教程


MFC DLL 向导(摘)


OVER!!!JJJ