com技术组件第7章,用vs2005编译示例代码,com注册不成功。

本文主要探讨了在Visual Studio 2005(VS2005)中编译COM技术组件时遇到的注册不成功问题。常见原因包括权限不足和编译配置错误。解决方法包括检查和调整项目设置,如在预处理器定义中添加“_USRDLL”和项目名_EXPORTS,并确保正确链接DEF文件。同时,介绍了模块定义(.def)文件的作用以及如何通过调整.vcproj文件来确保正确的编译和链接选项。此外,还提到了VC6与VS2005的IDE设置差异,如字体配置、制表符设置和行宽标准。最后,提醒注意日志文件以排查错误。

1.先排除你的权限问题,只要网上搜索这个问题,就会给你说权限问题。
2.如果是自己建的工程,很大可能是编译的问题。虽然总是提示成功,但是模块文件(.def)文件没有加载连接,就会生成一个普通的dll文件,不能注册。因为DLLRegisterServer没有被正确的连接到.dll中。
解决方案:
   1、将项目->C/C++ ->预处理器 -> 预处理定义加上“;_USRDLL;项目名_EXPORTS",还有链接器 -> 输入 ->项目的DEF文件。
   2、根据Linux的makefile文件,可以知道,vs2005一定也有一个类似的文件,用来编译连接的,就是大名鼎鼎的.vcproj文件,在 网上下载一个能成功注册的com模板,查看里面的配置。 PreprocessorDefinitions这一个字段,和ModuleDefinitionFile这个字段。模仿着写。
实际上,两个方法的主要目的就是将你的这些文件,用正确的命令去解释翻译。也就是以前的大牛一步一步去写的DOS命令。各种编译连接选项。
补充知识:
1、_MANAGED   MS中的C++/CLI 编译连接命令
2、模块定义
模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时,.def 文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。也可以将 __declspec(dllexport) 用作指定导出函数的手段。在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用 .def 文件。
如果导出 C++ 文件中的函数,必须将修饰名放到 .def 文件中,或者通过使用外部“C”定义具有标准 C 链接的导出函数。如果需要将修饰名放到 .def 文件中,则可以通过使用 DUMPBIN 工具或 /MAP 链接器选项来获取修饰名。请注意,编译器产生的修饰名是编译器特定的。如果将 Visual C++ 编译器产生的修饰名放到 .def 文件中,则链接到 DLL 的应用程序必须也是用相同版本的 Visual C++ 生成的,这样调用应用程序中的修饰名才能与 DLL 的 .def 文件中的导出名相匹配。

3、一.IDE基础配置
1. 字体
VC6中“Tools→Options→Format→Font”配置字体;VC2005中“工具→选项→环境→字体和颜色”配置字体。
编写代码一般采用等宽字体,等宽点阵(位图)字体,相对矢量字体而言具有兼容性好和显示清晰的优点。常用的编程等宽字体包括Fixedsys(VC6和notepad御用字体)、Consolas、YaHei Mono。
VC6默认可选字体只有Fixedsys和Terminal,可通过修改注册表来改字体,在HKEY_CURRENT_USER/Software/Microsoft/DevStudio/6.0/Format下面有几个子键,可以修改Source  Window键的FontFace和FontSize来配置源代码窗口的显示字体。例如设置11号的Consolas字体:FontFace=Consolas,FontSize=11。
2. 制表符(TAB)
程序块要采用缩进风格编写,IDE碰到左括号换行的情况一般会自动缩进(Auto Indent),缩进的空格数和制表符的宽度一般设为4个半角字符。由于不同的编辑器对TAB空格数的设置可能不一样,有的是4有的是8,为避免使用不同的编辑器阅读程序时的布局不整齐问题,建议只使用空格键对齐。
VC6中“Tools→Options→Tabs”的“Insert spaces/Keep tabs”中选择“Insert spaces”;VC2005中“工具→选项→文本编辑器→所有语言→制表符”可配置制表符大小(Tab Size)/缩进大小(Indent Size)为4,对“插入空格/保留制表符”勾选“插入空格”。
3. 行代码字符数
关于一行编写多少代码换行比较合适的问题,可以在VC中输入一行”//”即可得知,一般为75或80。
4.外接插件和外部工具
外接插件能扩展Visual Studio的功能,例如VC6默认并无行号显示功能,可以使用VC6LineNumberAddin插件实现显示行号,“Tools -> Customize→Add-ins and Macro Files”选择“Browse”进VC6LineNumberAddin.dll即可加载使用。我们在VC2005的“工具→外接程序管理器”中可以看到安装的“Visual Assist X”插件,并可选择启用与否。
外部工具主要是结合IDE使用,如使用AStyle格式化当前打开的代码文件,使用gedit打开当前代码文件。外部工具的配置很简单,VC6中通过“Tools→Customize→Tools”添加,VC2005中通过“工具→外部工具”添加。
以下为AStyle的配置:
标题:AStyle
命令:C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/AStyle.exe
参数:--style=ansi $(ItemFileName)$(ItemExt)
初始目录:$(ItemDir)
勾选“使用输出窗口”。
这样,“工具菜单”中新增一个“AStyle”的子项,点击“AStyle”即可按ANSI风格格式化当前文件代码。
5. IDE指定和打开多个项目
Q1:安装VS2005后,之前的VC6默认打开程序和图标都变更为VC2005的风格。如何恢复至VC6的默认风格呢?
A1:工具→文件夹选项→文件类型(Win7中是设置默认程序)
找到DSW文件,高级(可能先还原)→编辑,用于执行操作的应用程序由"C:/Program Files/Microsoft Visual Studio 8/Common7/IDE/devenv.exe" "%1"更改为"C:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin/MSDEV.EXE" "%1",这样默认*.dsw文件就以VC6.0打开,而不是以VC8.0打开。同样更改*.dsp文件类型以用VC6打开,当然可以更改显示图标为VC6风格的。
Q2:双击VC项目文件(*.sln/*.dsw),并没有打开一个新的IDE窗口,而是替代了已经打开的项目。
A2:工具→文件夹选项→文件类型(Win7中是设置默认程序)
找到DSW/SLN文件,高级(可能先还原)→编辑,勾掉“使用DDE”。
 
二.预处理宏
1. 通用宏
VC6.0中:
Project Setting→C/C++→Preprocessor definitions
VC2005中:
项目属性→配置属性→C/C++→预处理器定义
(1)平台识别宏
WIN32:指明是Window 32位系统平台。
常见的平台识别宏如下:
_DOS_:MS-DOS 16位系统平台。
WIN64:指明是Window 64位系统平台。
_WIN32_WCE:Window Mobile 32位系统平台。
_UNIX:UNIX系统平台。
_POSIX_:POSIX(Portable Operating System Interface of Unix)系统平台。
_LINUX_:LINUX系统平台。
_APPLE_/_MAC_:苹果(Macintosh)系统平台。
(2)字符集识别宏
_MBCS/_UNICODE:指明该工程使用的字符集(多字节字符集/UNICODE)。
在VC6.0的“Project Setting→C/C++→Project Options”处将会有/D "_MBCS"或/D "_UNICODE"开关。
在VC2005的“项目属性→配置属性→常规→项目默认值→字符集”中选择“使用多字节字符集”或“使用 Unicode 字符集”;在“项目属性→配置属性→C/C++→使用UNICODE响应文件”中选择“是”或“否”。在“项目属性→配置属性→C/C++→命令行” 处将会有/D "_MBCS"或/D "_UNICODE" /D "UNICODE"开关。
当项目中的文件具有 UNICODE 路径(例如中文路径)时,应在“项目属性→C/C++→常规”和“项目属性→链接器→常规”中开启“使用UNICODE响应文件”开关。
(3)UI识别宏
_CONSOLE/_WINDOWS:指明应用程序的类型是控制台程序或窗口程序(CUI/GUI)。
(4)debug/release版本识别宏
_DEBUG/NDEBUG:指明编译版本(Debug/Release)。
2.项目类型特定宏
VC不同的项目类型,有一些特定的宏,以在编译器区分项目类型。
(1)Win32 Static Library项目
VC6.0中:
Project Setting→C/C++(Category:General)→Preprocessor definitions:_LIB
如果选择了MFC Support则_WINDOWS,_AFXDLL
VC2005中:
项目属性→常规→配置类型→静态库(.lib)
项目属性→C/C++→预处理器→预处理器定义:_LIB
(2)Win32 Dynamic-Link Library项目
VC6.0中:
Project Setting→C/C++→Preprocessor definitions:_WINDOWS,_USRDLL,DLL_EXPORTS
VC2005中:
项目属性→常规→配置类型→动态库(.dll)
项目属性→C/C++→预处理器→预处理器定义:_WINDOWS;_USRDLL;DLL_EXPORTS
(3)MFC DLL项目
<1>Regular DLL with MFC statically linked(带静态链接MFC的规则DLL)
VC6.0中:
Project Setting→C/C++→Preprocessor definitions:_WINDOWS,_WINDLL,_USRDLL
VC2005中:
项目属性→C/C++→预处理器→预处理器定义:_WINDOWS;_USRDLL
<2>Regular DLL using shared MFC DLL(使用共享MFC DLL的规则DLL)
VC6.0中:
Project Setting→C/C++→Preprocessor definitions:_WINDOWS,_WINDLL,_AFXDLL, _USRDLL
VC2005中:
项目属性→C/C++→预处理器→预处理器定义:_WINDOWS;_USRDLL
<3>MFC Extension DLL(using shared MFC DLL)(MFC扩展DLL)
VC6.0中:
Project Setting→C/C++→Preprocessor definitions:_WINDOWS,_WINDLL,_AFXDLL,_USRDLL
VC2005中:
项目属性→C/C++→预处理器→预处理器定义:_WINDOWS; _AFXEXT
在DLL项目中,_USRDLL宏表示生成Export Lib!
3.其他常用宏
__FILE__/__LINE__:
__FILE__为包含当前程序文件名的路径字符串,例如C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/stdio.h;__LINE__为当前程序代码行号,从1开始的整数。
__STDC__/__cplusplus:
当编译标准C (ANSI C)程序时,编译器自动定义__STDC__ ;当编译标准C++ 程序时,编译器自动定义__cplusplus。
_MSC_VER:Microsoft Visual C++编译器的版本号。例如VC++6.0为1200,VC++8.0为1400,以此类推。
WIN32_LEAN_AND_MEAN告诉编译器不加载MFC(Not Using MFC)。
 
关于VC编译器预处理宏,参考:
《AFXDLL 和 _AFXEXT》
《Predefined Macros(VC6.0)》
《C/C++ Preprocessor Reference-Predefined Macros(VC8.0)》
《What’s the difference between the WIN32 and _WIN32 defines in C++》
 
三.工作目录和控制台程序运行参数
VC6.0中:
“Project Setting→Debug→Working directory”处填写exe程序的工作目录。
在“Project Setting→Debug→Program argument”处填写main运行参数。
VC2005中:
在“项目属性→配置属性→调试→工作目录”处填写exe程序的工作目录。
在“项目属性→配置属性→调试→命令参数”处填写main运行参数。
 
默认的工作目录为ProjectDir,即*.dsp/*.vcproj所在目录。
通过编译器启动(Ctrl + F5)应用程序时,可以将所依赖的lib和dll库文件所在目录设为工作目录。应用程序执行期间,文件操作的默认路径为工作目录。
工作目录是指当前目录,GetCurrentDirectory()得到的路径;SetCurrentDirectory来改变。
运行目录是指exe所在路径,可通过GetModuleFileName()得到。
 
四.附加头文件包含
VC6.0中:
VC6.0默认include包含路径:Tools→Options→Directories→Include files。
对于特定项目的头文件包含,在“Project Setting→C/C++(Category:Preprocessor)→Additional include directories”处添加附加头文件目录,相对目录参考*.dsp文件。
目录路径不需添加双引号,路径分隔符为’/’或’/’,不必考虑反斜杠’/’的转义。多个路径之间以逗号分隔。
相应的在“Project Setting→C/C++→Project Options”中将会出现“/I”的包含命令。
VC2005中:
VC2005默认include包含路径:工具→选项→项目和解决方案→VC++目录→包含文件。
对于特定项目的头文件包含,在“项目属性→配置属性→C/C++→常规→附加包含目录”处添加附加包含目录,相对目录参考$ProjectPath(*.vcproj文件路径)。
目录路径不需添加双引号,路径分隔符为’/’或’/’,不必考虑反斜杠’/’的转义。多个路径之间以分号分隔。
相应的在“项目属性→配置属性→C/C++→命令行” 中将会出现“/I”的包含命令。
关于#include的两种包含方式
#include 为编译器指定的包含路径下的头文件:即在VC6.0中的“Tools→Options→Directories→Include files”(对应VC2005的“工具→选项→项目和解决方案→VC++目录→包含文件”)处指定的包含目录。默认情况下包括
(1)$(VCInstallDir)include(/Microsoft Visual Studio/VC98/INCLUDE)
(2)$(VCInstallDir)atlmfc/include(/Microsoft Visual Studio/VC98/ATL/INCLUDE、/Microsoft Visual Studio/VC98/MFC/INCLUDE)
(3)$(VCInstallDir)PlatformSDK/include(VC2005)。
对于“Tools→Options→Directories→Include files”(“工具→选项→项目和解决方案→VC++目录→包含文件”)目录下的文件的包含,一般可使用尖括号包含。系统对尖括号的包含优先到编译器设置的包含路径下定位,再到附加包含目录下进行定位。

无法打开”.def"文件应该是.vcproj中的ModuleDefinationFile字段没有引起的,项目配置上出错了。配好了,就没有问题了。

ps:
读日志。在vs2005输出下有个日志文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值