отладка без регистрации COM (c ++)

Я создал клиентское приложение COM, которое использует два COM server dll; Я хочу, чтобы это приложение работало без регистрации COM, например: winsxs / .manifests

Я получаю (... почти ожидалось ...) сообщение «Класс не зарегистрирован», когда я пытаюсь создать экземпляр своего COM-объект из моего клиентского приложения.

Я уже добивался успеха в такой конфигурации раньше, но я не могу понять, почему это не удалось.

  • MFC-клиент, который зависит от 2 COM-серверов (dll1.dll и dll2.dll)
  • COM-сервер dll1.dll зависит от dll2.dll
  • dll2.dll не имеет зависимости COM

COM-объекты У меня есть:

  • в dll1.dll (язык .idl)

-

[
    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;
};

-

  • в 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;
};

-

  • вызов клиента

-

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

-

  • client.exe.2.manifest

-

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

-


У меня нет ошибок при генерации контекста активации sxs: - нет ошибки в журнале Windows (должно означать, что синтаксис моего манифеста правильный) - sxstrace не обнаружил ошибок (журнал заканчивается сообщением «INFO: Activation Context Generation.» и не содержит ошибок или успешных сообщений; кроме того, я вижу, что мой манифест загружен правильно)

Есть идеи?

есть ли способ отладить sxs глубже, чем с sxstrace? получить список фактически зарегистрированных классов com или clr, например ???

Заранее спасибо

7
задан loic 16 February 2011 в 17:25
поделиться