我有一个注册免费的C++ COM组件,其清单我使用VS2010与mt.exe生成。除了我无法指定我的类使用哪种线程模型外,其他所有工作都适用。我创建了一个小型摄制项目,其生成的清单文件(RGS.dll.embed.manifest
)如下:注册免费COM,线程模型,MT.exe和* .RGS脚本
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="RGS.dll" hashalg="SHA1">
<comClass clsid="{4EB506E0-0D9C-4281-9B61-F027376E21C3}" tlbid="{6B48D06F-A84C-4B72-A70F-F1B091789E67}"></comClass>
<typelib tlbid="{6B48D06F-A84C-4B72-A70F-F1B091789E67}" version="1.0" helpdir="" flags="HASDISKIMAGE"></typelib>
</file>
<comInterfaceExternalProxyStub name="IRgsObject1" iid="{4620CAB8-3E56-42EC-818E-8A55DF9267B7}" tlbid="{6B48D06F-A84C-4B72-A70F-F1B091789E67}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
</assembly>
我有一个问题的部分是comClass节点
<comClass clsid="{4EB506E0-0D9C-4281-9B61-F027376E21C3}"
tlbid="{6B48D06F-A84C-4B72-A70F-F1B091789E67}"></comClass>
应有的ThreadingModel属性,如在以下页面的“Sxs和免费注册COM激活”示例中: http://blogs.msdn.com/b/junfeng/archive/2006/04/20/579748.aspx
我知道线程模型未在*.tlb
中指定,但来自Sen Harada's在MSDN文档的mt.exe
评论,你应该能够指定一个在注册脚本文件(*.rgs
) http://msdn.microsoft.com/en-us/library/windows/desktop/aa375649(v=vs.85).aspx
所以我有*.rgs
文件的ATL向导创建
HKCR
{
NoRemove CLSID
{
ForceRemove {4EB506E0-0D9C-4281-9B61-F027376E21C3} = s 'RgsObject1 Class'
{
ForceRemove Programmable
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Neutral'
}
TypeLib = s '{6B48D06F-A84C-4B72-A70F-F1B091789E67}'
Version = s '1.0'
}
}
}
所以我给该*.rgs
文件mt.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\mt.exe /nologo /verbose /out:"Debug\RGS.dll.embed.manifest" /tlb:"Debug\RGS.tlb" /rgs:"RgsObject1.rgs" /dll:"RGS.dll" /manifest Debug\RGS.dll.intermediate.manifest
而且从构建日志中看到,它已经成功地分析了*.rgs
文件
Valid GUID!!! {4EB506E0-0D9C-4281-9B61-F027376E21C3}
Adding entry ClsidTable[{4EB506E0-0D9C-4281-9B61-F027376E21C3}] = RgsObject1 Class
CManGenLib.ParseFileContents::Appending class {00000000-0000-0000-0000-000000000000}
Processed .RGS file successfully
Found type library in file , guid {6B48D06F-A84C-4B72-A70F-F1B091789E67} (contains 2 types)
CManGenLib.ProcessTlb::Appending class {6B48D06F-A84C-4B72-A70F-F1B091789E67}
Found interface {4620CAB8-3E56-42EC-818E-8A55DF9267B7} 'IRgsObject1'
Processed .TLB file successfully
Looking for pstub {4620CAB8-3E56-42EC-818E-8A55DF9267B7} (IRgsObject1)
(特别是 “有效的GUID !!!” 行不rgs:
参数去mt.exe
)
但我的RGS.dll.embed.manifest
不具备的ThreadingModel属性。
这个人是我在网上唯一可以找到的关于问题http://social.msdn.microsoft.com/Forums/en-US/vcmfcatl/thread/dbab28cd-023f-45b1-be62-7dc71e8d3d9f的在线人员,他从来没有找到解决方案并在生成清单后对其进行编辑。有谁知道mt.exe工具如何使用RGS文件来创建清单,以及我需要做什么才能从另一端获取threadingModel?