Pergunta

Eu tenho construído COM um aplicativo cliente que usa dois COM as dlls do servidor;Eu quero que este aplicativo seja executado sem registro COM - ie:winsxs / .manifesta-se

Eu recebo um (...quase o esperado...) "Classe não registada" mensagem de erro ao tentar criar uma instância de meu objeto COM o meu aplicativo cliente.

Eu já conseguiram esse tipo de configuração antes, mas eu não consigo descobrir por que este falhar.


aqui estão mais alguns detalhes:

  • os módulos que eu tenho:
    • um MFC cliente que depende de 2 servidores COM (dll1.dll e dll2.dll)
    • dll1.dll COM servidor depende de dll2.dll
    • dll2.dll não tem COM dependência

os objetos COM que eu tenho:

  • no dll1.dll (.idl língua)

-

[
    object,
    uuid(262D00FB-3B9F-4A76-98FC-3051FDCAF0A6),
    dual,
    nonextensible,
    helpstring("IDialogManager Interface"),
    pointer_default(unique)
]
interface IDialogManager : IDispatch{
};
[
        uuid(58562535-BCA5-4D04-BB92-78F90EDA201E),
        //...
]
dispinterface _IDialogManagerEvents
{
};
[
        uuid(D599D3F0-A4D1-44A7-87A9-16032CC613CA),
        //...
]
coclass DialogManager
{
        [default] interface IDialogManager;
        [default, source] dispinterface _IDialogManagerEvents;
};

-

  • no dll2.dll

-

[
    object,
    uuid(2A183A2E-A620-4E00-B657-C9D2E59201D4),
    nonextensible,
    helpstring("ICadWizardsManager Interface"),
    pointer_default(unique)
]
interface ICadWizardsManager : IDispatch{
};
[
    object,
    uuid(FE97F3FB-8930-43BC-947D-64C90F45A071),
    nonextensible,
    helpstring("ICadWizard Interface"),
    pointer_default(unique)
]
interface ICadWizard : IDispatch{
};
[
    uuid(5365D4E6-ADFB-4429-9DEA-C44CC94AA3EF),
]
dispinterface _ICadWizardEvents
{
};
[
    uuid(CAC2D0BF-AD5B-4CC8-A04D-53AB23A0CDF4),
]
coclass CadWizard
{
    [default] interface ICadWizard;
    [default, source] dispinterface _ICadWizardEvents;
};
[
    uuid(3164FAC4-6F5F-4E4D-9B09-DC4115850D78),
]
dispinterface _ICadWizardsManagerEvents
{
};
[
    uuid(707CB6C8-311E-45EC-9DCB-50477F588BAF),
]
coclass CadWizardsManager
{
    [default] interface ICadWizardsManager;
    [default, source] dispinterface _ICadWizardsManagerEvents;
};

-

  • a chamada do cliente

-

IDialogManagerPtr dialogManager;
dialogManager.CreateInstance(CLSID_DialogManager); // <<< returns "Class not registered"

-

  • o cliente.exe.2.manifesto

-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity name="client" version="1.0.0.0" type="win32" processorArchitecture="x86"/>
<file name="dll2.dll">
 <comClass
     clsid="{707CB6C8-311E-45EC-9DCB-50477F588BAF}"
     threadingModel="apartment">
 </comClass>
 <comClass
     clsid="{CAC2D0BF-AD5B-4CC8-A04D-53AB23A0CDF4}"
     threadingModel="apartment">
 </comClass>
</file>

<file name="dll1.dll">
 <comClass
     clsid="{D599D3F0-A4D1-44A7-87A9-16032CC613CA}"
     threadingModel="apartment">
 </comClass>
</file>

</assembly>

-


Eu não tenho nenhum erro durante a ativação de sxs de geração de contexto:- nenhum erro no log do windows (deve que significa que a minha manifesto de sintaxe está correta) - nenhum erro detectado pelo sxstrace (o registo termina com "INFO:Geração de Contexto de ativação bem-sucedida." mensagem de e não contém nenhum erro ou sucpicious mensagem;além disso, eu vejo que o meu manifesto é carregado corretamente)

Alguma idéia?

existe uma maneira de depurar sxs mais profundo do que com sxstrace?obter a lista de realmente com registado ou classes clr, por exemplo???

Obrigado pelo avanço

Foi útil?

Solução

Normalmente existem pelo menos dois manifestos envolvidos na construção do contexto de ativação para registro livre COM.

Há o EXE manifesto, que especifica o seu assemblagens dependentes, incluindo o conjunto que contém os componentes, e há o manifesto do assembly, descrevendo a dll, classes de janela, e COM objectos na assembleia.

Este Blog contém informações sobre o que o .2 significa.Basicamente, quando o sistema procura por um manifesto, ele olha para modulename.exe[.resid].manifesto - No caso resid é 1, é omitido.

Então, você está usando o MFC, o que significa que DevStudio, o que significa que o projeto já deve ser configurado para produzir um recurso RT_MANIFEST automaticamente com o c-tempo de execução e de controle comum 6 configurações.

Visual Studio 2005 oferece suporte a essa sintaxe para mesclar dependentAssembly elementos com o seu aplicativos de manifesto, sem ter que tentar mesclar XML diretamente:

#pragma comment(linker, \
    "\"/manifestdependency:type='Win32' "\
    "name='client' "\
    "version='1.0.0.0' "\
    "processorArchitecture='*' "\
    "language='*'\"")

Então, se você acrescentar que, para um cpp de cabeçalho ou no seu .exe e, em seguida, guarde o seu cliente.exe.2.manifestam-se como "cliente.manifesto", você deve estar de todos os sistemas de ir.

Outras dicas

A explicação simples é que o .manifesto de arquivo não está sendo usado.O que é altamente provável que, neste cenário, o seu .exe quase certamente já contém um manifesto, incorporado como um recurso.Muito comum para um aplicativo do MFC para habilitar o visual estilos.E para o código compilado pelo VS2005 ou 2008 compiladores que incorpora um manifesto para encontrar a Dll de tempo de execução.

Para verificar isso, use o Arquivo + Abrir + de Arquivo e selecione o compilado .arquivo exe.Olhar para o RT_MANIFEST nó.Se o Windows encontrar um tal manifesto incorporado não vai continuar a procurar por um arquivo baseado em um.Você precisa mesclar seu regfree COM entradas para o incorporado um.Eu desejo que eu poderia dar-lhe uma boa Biblioteca MSDN link, mas os documentos sobre os manifestos de chupar grave rock.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top