VS2008 Non-MFC Dll创建和调用

本文介绍了如何在VS2008中创建Non-MFC DLL,包括导出函数的方法和使用_declspec关键字。通过示例展示了如何创建DLL项目和依赖项目,以及解决编译过程中可能出现的问题,如字符集不匹配。最后讨论了去掉导出关键字和使用静态变量的影响。

微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。Non-MFC DLL指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFCMFC编写的应用程序所调用。Regular DLL:和下述的Extension Dlls一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C++DephiVisual BasicBorland C等编译环境下利用DLL开发应用程序。常规DLL又可细分成静态链接到MFC和动态链接到MFC上的。与常规DLL相比,使用扩展DLL用于导出增强MFC基础类的函数或子类,用这种类型的动态链接库,可以用来输出一个从MFC所继承下来的类。扩展DLL是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。例如你已经创建了一个从MFCCtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。扩展DLL 和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。

 

我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。

 

导出和导入关键字

extern "C" _declspec(dllexport)用于导出DLL提供的函数,每一个需要导出的函数,其申明就该以其开头。用DEF文件也可以实现相同功能。

extern "C" _declspec(dllimport)用于隐式链接。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。如果采用这种方式就需要使用语句#pragma comment(lib"your.lib")来告诉编译器一个需要引入的库文件。相对于隐式链接还有一种显示链接。

示例采用导出关键字和显示链接的方式。

VS2008中选择Win32->Win32Project->Application Settings->DLL创建一个包含一个Project RegExpSolution

建立一个头文件regexp.h

 

创建一个CPP文件regexp.cpp

编译即可。

Solution Explorer中新建一个项目Project RegExpTest。(Win32->Win32 Console Applications)。 创建一个CPP文件CoreTest.cpp

编译一下,很可惜编译不过。右击RegExpTest选择Project Dependencies,配置RegExpTest依赖于RegExp,并且设置编译次序。OK,大功告成。

 

运气不好可能会碰到如下编译错误:cannot convert parameter 1 from 'const char [12]' to 'LPCTSTR'。解决方法很简单,如果使用了MFC,直接在RegExp.dll写成_T(RegExp.dll)。另外一种方法将项目的字符集改成Use Multi-Byte Character SetConfiguration Properties > General > Character Set),重新编译即可。

 

可以试试去掉_declspec(dllexport)关键字会怎么样?

RunCount声明为静态的有没有好处?

 

参考

http://msdn.microsoft.com/zh-cn/library/1ez7dh12(v=VS.80).aspx

http://dev.yesky.com/283/2640283.shtml

http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/c1b08c0a-a803-41c3-ac8c-84eba3be1ddb/

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值