Jac*_*ith 7 c++ com registry atl visual-studio-2010
我正在创建一个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'
}
}
}
Run Code Online (Sandbox Code Playgroud)
这为CLSID正确创建了注册表项.但是,当尝试从外部调用CoCreateInstance时,我遇到了挂起.
hr = CoCreateInstance( __uuidof(Test), NULL, CLSCTX_ALL, __uuidof(ITest), (void**)&pTest);
Run Code Online (Sandbox Code Playgroud)
在看了一些其他项目的例子之后,我注意到他们都有类型的注册表项:
HKEY_CLASSES_ROOT\<MODULE>.<CLASS>
HKEY_CLASSES_ROOT\<MODULE>.<CLASS>\CLSID
Run Code Online (Sandbox Code Playgroud)
我调查了这些类的.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'
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我的CoCreateInstance调用不再挂起,我能够正确检索指向ITest接口的指针.
现在,我的问题是,考虑到上述细节,我如何确保我创建的任何未来类都具有正确的.rgs文件格式?在创建类对象时是否有一些我缺少的选项?或者我是否需要为我创建的每个类手动添加上述内容?
我正在使用Visual Studio 2010.
那是coclass的ProgID.它主要由脚本语言使用,即使用后期绑定的语言. CreateObject()是通常的函数名.这与挂起有关是无法解释的,你最好调试一下.
否则.rgs条目由ATL向导自动生成.ProgID编辑框是右下角的编辑框.它不会像其他人一样自动填充,你可能会错过它.
| 归档时间: |
|
| 查看次数: |
8612 次 |
| 最近记录: |