2012-11-26 79 views
9

我有一個註冊免費的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評論,你應該能夠指定一個在註冊腳本文件(*.rgshttp://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?

回答

5

有趣......它看起來像一些退化的ProgId東西需要在那裏爲mt.exe感到高興。特別是,以下*.rgs

HKCR 
{ 
    AtlObjectProgId.1 = s 'AtlObject Class' 
    { 
     CLSID = s '{2371607D-284A-4D7C-A6DD-20C15373F43F}' 
    } 
    NoRemove CLSID 
    { 
     ForceRemove {2371607D-284A-4D7C-A6DD-20C15373F43F} = s 'AtlObject Class' 
     { 
      InprocServer32 = s '%MODULE%' 
      { 
       val ThreadingModel = s 'Free' 
      } 
     } 
    } 
} 

產生以下*.embed.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><file name="ATLProject2.dll" hashalg="SHA1"><comClass clsid="{2371607D-284A-4D7C-A6DD-20C15373F43F}" tlbid="{92B1424C-0D03-4909-99DC-2A70EFD210D5}" threadingModel="Free"></comClass><typelib tlbid="{92B1424C-0D03-4909-99DC-2A70EFD210D5}" version="1.0" helpdir="" flags="HASDISKIMAGE"></typelib></file><comInterfaceExternalProxyStub name="IAtlObject" iid="{81A8B3DA-2AFE-4C25-B0ED-CDD777FB01A4}" tlbid="{92B1424C-0D03-4909-99DC-2A70EFD210D5}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub></assembly> 

而以下*.rgs

HKCR 
{ 
    NoRemove CLSID 
    { 
     ForceRemove {2371607D-284A-4D7C-A6DD-20C15373F43F} = s 'AtlObject Class' 
     { 
      InprocServer32 = s '%MODULE%' 
      { 
       val ThreadingModel = s 'Free' 
      } 
     } 
    } 
} 

產生以下*.embed.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><file name="ATLProject2.dll" hashalg="SHA1"><comClass clsid="{2371607D-284A-4D7C-A6DD-20C15373F43F}" tlbid="{92B1424C-0D03-4909-99DC-2A70EFD210D5}"></comClass><typelib tlbid="{92B1424C-0D03-4909-99DC-2A70EFD210D5}" version="1.0" helpdir="" flags="HASDISKIMAGE"></typelib></file><comInterfaceExternalProxyStub name="IAtlObject" iid="{81A8B3DA-2AFE-4C25-B0ED-CDD777FB01A4}" tlbid="{92B1424C-0D03-4909-99DC-2A70EFD210D5}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub></assembly> 

編輯:看起來,這工作,但它只適用於*.rgs文件中的第一類。例如,下面的*.rgs

HKCR 
{ 
    AtlObj1ProgId.1 = s 'AtlObj1 Class' 
    { 
     CLSID = s '{D15A646A-4F2F-42C2-BA8B-780AABCFB133}' 
    } 
    AtlObj1ProgId = s 'AtlObj1 Class' 
    {  
     CurVer = s 'AtlObj1ProgId.1' 
    } 
    NoRemove CLSID 
    { 
     ForceRemove {D15A646A-4F2F-42C2-BA8B-780AABCFB133} = s 'AtlObj1 Class' 
     { 
      ProgID = s 'AtlObj1ProgId.1' 
      VersionIndependentProgID = s 'AtlObj1ProgId' 
      ForceRemove Programmable 
      InprocServer32 = s '%MODULE%' 
      { 
       val ThreadingModel = s 'Neutral' 
      } 
      TypeLib = s '{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}' 
      Version = s '1.0' 
     } 
    } 

    AltObj2ProgId.1 = s 'AtlObj2 Class' 
    { 
     CLSID = s '{C208B430-8E12-4C65-AA5A-899F6AB13C4B}' 
    } 
    AltObj2ProgId = s 'AtlObj2 Class' 
    {  
     CurVer = s 'AltObj2ProgId.1' 
    } 
    NoRemove CLSID 
    { 
     ForceRemove {C208B430-8E12-4C65-AA5A-899F6AB13C4B} = s 'AtlObj2 Class' 
     { 
      ProgID = s 'AltObj2ProgId.1' 
      VersionIndependentProgID = s 'AltObj2ProgId' 
      ForceRemove Programmable 
      InprocServer32 = s '%MODULE%' 
      { 
       val ThreadingModel = s 'Neutral' 
      } 
      TypeLib = s '{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}' 
      Version = s '1.0' 
     } 
    } 
} 

產生下列*.embed.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><file name="RgsClass2.dll" hashalg="SHA1"><comClass clsid="{D15A646A-4F2F-42C2-BA8B-780AABCFB133}" tlbid="{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}" threadingModel="Neutral" progid="AltObj2ProgId"><progid>AtlObj1ProgId.1</progid><progid>AltObj2ProgId.1</progid></comClass><comClass clsid="{C208B430-8E12-4C65-AA5A-899F6AB13C4B}" tlbid="{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}"></comClass><typelib tlbid="{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}" version="1.0" helpdir="" flags="HASDISKIMAGE"></typelib></file><trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"><security><requestedPrivileges><requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel></requestedPrivileges></security></trustInfo><comInterfaceExternalProxyStub name="IAtlObj1" iid="{FF2A4D47-DADA-451E-8125-610643B00FBC}" tlbid="{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub><comInterfaceExternalProxyStub name="IAtlObj2" iid="{F9226919-2AB7-4DBE-9F79-092839480351}" tlbid="{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub></assembly> 

觀察到僅第一的CoClass具有的ThreadingModel(或一個ProgID就此而言)。


編輯:成功!下面*.rgs

HKCR 
{ 
    AtlObj1ProgId.1 = s 'AtlObj1 Class' 
    { 
     CLSID = s '{D15A646A-4F2F-42C2-BA8B-780AABCFB133}' 
    } 

    NoRemove CLSID 
    { 
     ForceRemove {D15A646A-4F2F-42C2-BA8B-780AABCFB133} = s 'AtlObj1 Class' 
     { 
      ProgID = s 'AtlObj1ProgId.1' 
      VersionIndependentProgID = s 'AtlObj1ProgId' 
      ForceRemove Programmable 
      InprocServer32 = s '%MODULE%' 
      { 
       val ThreadingModel = s 'Neutral' 
      } 
      TypeLib = s '{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}' 
      Version = s '1.0' 
     } 
    } 
} 

HKCR 
{ 
    AltObj2ProgId.1 = s 'AtlObj2 Class' 
    { 
     CLSID = s '{C208B430-8E12-4C65-AA5A-899F6AB13C4B}' 
    } 

    NoRemove CLSID 
    { 
     ForceRemove {C208B430-8E12-4C65-AA5A-899F6AB13C4B} = s 'AtlObj2 Class' 
     { 
      ProgID = s 'AltObj2ProgId.1' 
      VersionIndependentProgID = s 'AltObj2ProgId' 
      ForceRemove Programmable 
      InprocServer32 = s '%MODULE%' 
      { 
       val ThreadingModel = s 'Neutral' 
      } 
      TypeLib = s '{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}' 
      Version = s '1.0' 
     } 
    } 
} 

產生以下*.embed.manifest

​​