2012-11-26 22 views
9

登録無料のC++ COMコンポーネントがあります。そのコンポーネントのマニフェストはVS2010を使用してmt.exeで生成しています。私のクラスで使用するスレッドモデルを指定することはできません。私は、そのマニフェストファイル(RGS.dll.embed.manifest)生成された次のようにある小さなREPROプロジェクト、作成:登録無料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に指定されていない知っているが、セン原田さんからmt.exeのためのMSDNのドキュメントにコメント、あなたは(*.rgs)登録スクリプトファイル内のいずれかを指定することができるはずです http://msdn.microsoft.com/en-us/library/windows/desktop/aa375649(v=vs.85).aspx

だから私は、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ファイル*.rgsファイル(特に "有効なGUID !!!" 行がmt.exergs:パラメータなしでなくなっている)

 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) 

はまだ私の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

興味深い... mt.exeが幸せになるためには、ProgIdの痕跡がいくつかあるようです。具体的には、以下*.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' 
      } 
     } 
    } 
} 

は、以下*.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}" 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> 

を生成し、次の*.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

​​ 生成します
関連する問題