9

VS2010 を使用して mt.exe でマニフェストを生成している登録不要の C++ COM コンポーネントがあります。クラスが使用するスレッドモデルを指定できないことを除いて、すべてが機能します。小さな再現プロジェクトを作成しました。生成されたマニフェスト ファイル ( RGS.dll.embed.manifest) は次のとおりです。

<?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>

次のページの「Sxs と登録不要の COM アクティベーション」の例のように、threadingModel 属性が必要です

でスレッド モデルが指定されていないことは知っていますが、*.tlb原田センの MSDN ドキュメントに関するコメントから、登録スクリプト ファイル ( ) http://msdn.microsoft.com/en-usmt.exeでスレッド モデルを指定できるはずです。 /library/windows/desktop/aa375649(v=vs.85).aspx*.rgs

*.rgsATLウィザードが作成したファイルがあります

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)

(具体的には、"Valid GUID!!!" の行は、rgs:パラメータなしで削除されますmt.exe)

まだ私にRGS.dll.embed.manifestはthreadingModel属性がありません。

この人は、私がオンラインでこの問題について話しているのを見つけることができる唯一の人です。解決策を見つけ、生成後にマニフェストを編集しました。mt.exe ツールが RGS ファイルを使用してマニフェストを作成する方法と、threadingModel を取得するために必要なことを知っている人はいますか?

4

1 に答える 1

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'
            }
        }
    }
}

以下を生成します*.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

<?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="AtlObj1ProgId"><progid>AtlObj1ProgId.1</progid></comClass><comClass clsid="{C208B430-8E12-4C65-AA5A-899F6AB13C4B}" tlbid="{85D8EC5E-3C24-4151-83D9-34CCE9A1E534}" threadingModel="Neutral" progid="AltObj2ProgId"><progid>AltObj2ProgId.1</progid></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>
于 2012-11-27T02:13:04.423 に答える