由于即将开发的C++插件具有相同的标准规范,所以在正式开发插件前,先创建几种常用工程,配置好后就作为其他工程的模板。要创建新的插件工程时,直接复制模板工程的所有文件,替换文件名和内容,就得到新的工程。
VC++ 6.0 工程配置(不使用MFC的普通DLL插件工程)
- 对于不使用MFC的普通DLL插件工程,使用“Win32 Dynamic-Link Library”向导创建工程,输入模板工程名称(例如为Win32DllTempl),使用选项“An empty DLL project”或“A simple DLL project”完成创建;
- 接下来进行工程设置:
选择“All Configurations”,进入“C/C++”页面
1)设置警告级别为最高级“Level 4”;
2)设置预处理定义列表,由于我们要使用UNICODE编码,故去掉 _MBCS,换成 UNICODE 和 _UNICODE,去掉不需要的 WIN32DLLTEMPL2_EXPORTS,最终得到的列表为 WIN32,_WINDOWS,_USRDLL,UNICODE,_UNICODE
3)在“C++ Language”组中,选中“Enable Run-Time Type Information (RTTI)”选项,以便使插件接口动态转换能生效
4)在预编译头文件中设置为“Use precompiled header file (.pch)”,对应头文件为 stdafx.h
5)在“Code Generation”组中,对Debug和Release的“Use run-time library”分别设置为“Debug Multithreaded DLL”和“Debug Multithreaded”,即使用动态库版的C++运行时文件
选择“All Configurations”,进入“Link”页面
1)将LIB列表的默认值“kernel32.lib user32.lib advapi32.lib”等所有LIB去掉,以后需要哪个再加
2)选中“Generate mapfile”选项,以便程序崩溃时可使用特殊技术定位到出错位置 - 设置工程的各种输出路径
切换到Debug配置模式,在“General”页面,分别设置临时文件和输出文件的目录为
..\..\..\Obj\VC60\Debug\Win32DllTempl
..\..\..\Bin\VC60\Debug\Plugins
在“Link”页面的“General”组,将输出文件由Win32DllTempl.dll改为Win32DllTempl.Plugin.dll(这样批量加载插件时就可以用 *.Plugin.dll 匹配,避免加载不是插件的DLL文件),输出文件的全名为 ..\..\..\Bin\VC60\Debug\Plugins/Win32DllTempl.Plugin.dll
在“Customize”页面,设置符号调试库文件为:
..\..\..\Bin\VC60\Debug\Symbols/Win32DllTempl.Plugin.pdb
在“Debug”页面,设置符号映射文件为
..\..\..\Bin\VC60\Debug\Symbols/Win32DllTempl.Plugin.map
在“Project Options”编辑框中最末尾找到Win32DllTempl.Plugin.lib,由于我们不需要LIB文件,故把对应的文件全名改为
..\..\..\Obj\VC60\Debug\Lib/Win32DllTempl.Plugin.lib
对于Release配置模式下的输出路径,将上述路径中的 Debug 改为 Release 即可。
VC++ 6.0 工程配置(使用MFC的插件工程)
最好使用MFC扩展DLL,这样就可以避免在多个DLL之间切换MFC环境的问题,具体是用“MFC AppWizard (dll)”向导创建工程,然后选择“MFC Extensin DLL (using shared MFC DLL)”。
在这里我们采用更简单的方法,在上面介绍的Win32DLL工程基础上,把得到的工程目录复制出来,替换工程名称。然后进行如下工程设置:
- 选择“All Configurations”,进入“General”页面,选择MFC类型为“Use MFC in a Shared DLL”
- 预处理定义列表改为 WIN32,_WINDOWS,_AFXEXT,_UNICODE,_WINDLL,_AFXDLL
VC++ 2005/2008 工程设置
相对于VC++6.0,VC++ 2005/2008 的工程设置更简单,默认已经是UNICODE、Multithreaded DLL、开启了RTTI。
分别创建Win32DLL和MFC扩展DLL工程,选中这两个工程、选择所有配置模式,设置下面的各种路径:
临时文件目录: ..\..\..\Obj\VC80\$(ConfigurationName)\$(ProjectName)
输出文件目录: ..\..\..\Bin\VC80\$(ConfigurationName)
输出文件: $(OutDir)\Plugins/$(ProjectName).Plugin.dll
符号调试文件: $(OutDir)\Symbols/$(ProjectName).Plugin.pdb
符号映射文件: $(OutDir)\Symbols/$(ProjectName).Plugin.map
生成LIB文件: $(IntDir)/$(ProjectName).Plugin.lib
选择警告级别为 Level 4 (/W4),开启MAP文件输出选项
对于MFC工程,将Link页中的模块定义文件值“.\MFCExtTempl.def”去掉