atlcom类注册.rgs文件默认值
ATL COM class registration .rgs file defaults
我正在创建一个COM服务器可执行文件,并且遇到了类注册的问题。当我创建类对象时,自动生成的.rgs文件如下所示:
HKCR
{
NoRemove CLSID
{
ForceRemove {4C6DAD45-64B4-4C55-81C6-4CE125226421} = s 'Test Class'
{
ForceRemove Programmable
LocalServer32 = s '%MODULE%'
{
val ServerExecutable = s '%MODULE_RAW%'
}
TypeLib = s '{EAA173CA-BDBC-463A-8B7A-B010EFA467BC}'
Version = s '1.0'
}
}
}
这为CLSID正确创建了注册表项。然而,当试图在外部调用CoCreateInstance时,我遇到了一个挂起。
hr = CoCreateInstance( __uuidof(Test), NULL, CLSCTX_ALL, __uuidof(ITest), (void**)&pTest);
在查看了其他一些项目的示例之后,我注意到它们的注册表项的类型都是:
HKEY_CLASSES_ROOT<MODULE>.<CLASS>
HKEY_CLASSES_ROOT<MODULE>.<CLASS>CLSID
我调查了这些类的.rgs文件,并注意到它们有我的.rgs文件中没有的额外条目。我将它们添加到我的目录中,并将其更改为:
HKCR
{
TestModule.Test = s 'Test Class'
{
CLSID = s '{4C6DAD45-64B4-4C55-81C6-4CE125226421}'
}
NoRemove CLSID
{
ForceRemove {4C6DAD45-64B4-4C55-81C6-4CE125226421} = s 'Test Class'
{
ForceRemove Programmable
LocalServer32 = s '%MODULE%'
{
val ServerExecutable = s '%MODULE_RAW%'
}
TypeLib = s '{EAA173CA-BDBC-463A-8B7A-B010EFA467BC}'
Version = s '1.0'
}
}
}
你瞧,我的CoCreateInstance调用不再挂起,我能够正确地检索到一个ITest接口的指针。
现在,我的问题是,考虑到上述细节,我如何确保我未来创建的任何类都具有这种正确的.rgs文件格式?在创建类对象时是否缺少某些选项?或者我需要为我创建的每个类手动添加上述内容?我用的是Visual Studio 2010
这是coclass的ProgID。它主要由脚本语言使用,这些语言使用后期绑定。CreateObject()是常用的函数名。这和挂起有什么关系是无法解释的,你最好调试一下。
.rgs表项由ATL向导自动生成。右下方为ProgID编辑框。它不会像其他的一样自动填充,你可能错过了它
抱歉五年后才来…我在使用Visual Studio 2015 pro的ATL COM向导中遇到了类似的问题。(错误0x80080005 -服务器执行失败)它看起来像是ATL COM向导上的一个错误(因为一些VS版本,并且仍然没有在最新的VS2015上纠正)。
我在这个MS页面上找到了一个手动更正的答案:https://connect.microsoft.com/VisualStudio/feedback/details/782281/catlservicemodulet-not-registering-components
以上链接不再可用。然而,这个问题在这个博客中解释:https://blogs.msdn.microsoft.com/jigarme/2008/05/07/cocreateinstance -返回- 0 - x80080005 - -视觉工作室- 2008 -基于atl service/
基本上,向导无法在关联的rgs文件中添加AppID注册表项:
NoRemove CLSID
{
ForceRemove {...} = s '...'
{
...
val AppID = s '%APPID%'
}
}
.rgs文件没有完全被向导填充。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 当给定默认值时,为什么此模板参数推导失败
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 格式化浮点值:返回默认值
- 如何将数组部分初始化为某个默认值?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 创建一个包含 c++ 默认值的环境文件
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- Switch 语句(字符串)一直选择默认值,除非其为零
- 如何使用默认值将枚举声明为 extern
- 如何在提升程序选项中设置矢量<矢量>的默认值<string>
- 如何使用默认值为构造函数中的枚举赋值?
- Visual Studios (2012 pro 主要是) <从父级继承或项目默认值的默认值的文件位置>
- c++:在文件中写入双精度值,精度高于默认值
- C++ IO 二进制文件流:未指定输出时的默认值
- C++构造函数默认值头文件
- 如何在 gflags 中将默认值设置为标志文件
- atlcom类注册.rgs文件默认值