vs2008下win32 dll封装笔记

来源:互联网 发布:电脑txt小说编辑软件 编辑:程序博客网 时间:2024/04/30 09:19
参考:http://www.cnblogs.com/wdhust/archive/2010/06/01/1749148.htm
http://www.cppblog.com/XiaoMeiAQing/archive/2009/10/01/97697.html
http://xiaoou2002.blog.163.com/blog/static/21586669200922652738585/


一、创建DLL
1. 在VC中新建一个Win32空项目MathLib,new->project->win32 console application->DLL,empty->finish;
2. 建立,添加导出头文件export.h
为方便,通常先添加如下代码:
#define export
#ifdef export
#define MATH_LIB_API _declspec(export)
#else
#define MATH_LIB_API _declspec(import)
#endif
然后, 将你要导出的类,函数,全局变量,添加到导出头文件中:
添加全局变量:
extern MATH_LIB_API  int global_variable;
添加函数:
MATH_LIB_API   void fanction();
添加类:
class MATH_LIB_API   class_math{};
3. 建立对应头文件的实现文件export.cpp
4. 编译,连接之后,在sln所在的文件夹下的Debug文件夹中产生一个MathLib.lib文件和一个MathLib.dll文件


note:如果没生成.lib而只生成.dll,说明你没有导出类,函数或全局变量。请仔细查看到导出头文件。


二、调用DLL
1. 测试依据如上方式所建的DLL,新建一个测试win32应用程序工程,将步骤一产生的.lib和.dll复制到测试工程.cpp所在的文件夹中。
2. 编写测试工程头文件test.h
将步骤一中的头文件export.h中内容复制到test.h中,并注释掉#define export
3. 编写测试工程.cpp
首先添加
#include "test.h"
#pragama comment(lib,"MathLib.lib")


三、一些问题及解决
1. 如果我们不想将整个类导出,从而避免向用户暴露太多东西,如何做?
(1)在DLL工程的export.cpp中建一个全局类指针
(2)建立对象函数。在export.cpp中定义一个函数,该函数用来new一个类对象并初始化步骤(1)的类指针。
(3)功能实现函数。在export.cpp中定义一个函数,在该函数中,调用类的主要功能实现函数。
(4)销毁对象函数。在export.cpp中定义一个函数,该函数用来delete(2)中类对象。
(5)导出(2)(3)(4)步骤中定义的函数,在export.h中导出上述三个函数。
这样,只导出给客户实现类功能的3个函数,而没有导出该类。
2. 封装Win32 console application对应的DLL工程中文件和原来Win32 console application工程文件的联系?
(1)准备:在Win32 console application中,定义完所有功能实现的.cpp和对应的.h文件后,再定义一个上述步骤1的描述的3个包装函数的export.h声明文件和对应的export.cpp定义文件,并调试通过。
(2)将Win32 console application中所有文件,包括(1)中添加的export.h和export.cpp,复制到DLL工程中,修改export.h,将export.h中函数声明成导出函数(如步骤一中2)。
3. 通常封装库,要在你的库内使用namespace功能。
4. DLL调试
    如何调试DLL工程中新添加的接口文件?将步骤三中3所建立的测试文件的Debug目录下的.exe文件copy到DLL工程文件中lib,dll文件所在目录下。然后F5即可运行调试。


可以参考以下:from:http://topic.csdn.net/t/20020919/17/1037673.html


有以下3种方法 
1.同时使用DLL和应用程序的工程来调试 
将2个工程放在一个workspace里,可以使用Project/Insert   Project   into   Wordspace...弹出对话框选择,也可以在打开1个工程的情况下,直接使用File/new...选择Project创建另一个新工程,选中,Add   to   current   workspace 
为了调试,2个工程都使用Win32   debug(或者   Unicode   Debug)版本,在Project/Settings/link   都选中Generate   Debug   Info 
Project/Settings/debug/Category选择Additional   DLLs,添加要调试的Dll文件,Project/Dependencies..选择应用程序的工程以来与Dll的工程,当Dll工程改动后,编译链接生成新版本,为了不经常来回手工拷贝Dll文件,可在Dll工程中的Project/Setting/Post-Build   Step加上诸如 "copy   \debug\test.dll   app\debug "的命令,这样每编译1次都会自动拷贝。 
如果是隐式链接Dll,需要从Dll中获得导出信息的头文件和编译生成的导入库lib文件。头文件用#include加入,Project/Add   to   project/Files...加入lib文件 


2.使用应用程序的工程来调试Dll 
Project/Settings/debug/Category选择Additional   DLLs,添加要调试的Dll文件,如果是远程调试(Build/Debugger   Remote   Connection...中设置),必须给出完整的网络路径。 
这个Dll必须是编译成Win32   Debug(或   Unicode   Debug)版本的,包含有调试信息,这样尽管Dll的源程序不是这个工程的组成部分,也可以在应用程序和Dll中设置断点。 


3.使用Dll的工程来调试Dll 
打开Dll工程,Project/Settings/Debug/Category选择General,为这个Dll指定1个可执行程序,可以就是另外开发的的使用该Dll的用户程序。 


具体调试过程中,可以从应用程序单步跟踪到Dll中,在Dll中设置断点,在应用程序中调用Dll中的程序,执行到这个断点时,就会中断,便于检查此时Dll的状态。通过改变、设置应用程序执行环境和不同执行路径,为Dll程序调试提供多种检查方式。 


罗嗦写了1堆,累。 


当然关键还是要多实践....:)
0 0