Поиск:

Ответ в темуСоздание новой темы Создание опроса
> E_NOINTERFACE в ATL/EXE сервер 
:(
    Опции темы
obiwan
Дата 14.10.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.7.2007
Где: Ukraine

Репутация: нет
Всего: нет



Доброго времени суток.
Столкнулся со следующей проблемой: создал ATL/EXE сервер, в нем создал класс, для него сделал 2 интерфейса, реализовал их. В клиенте постоянно получаю из CoCreateInstance E_NOINTERFACE. В реестре все зарегистрировалось, не могу понять в чем проблема. Сильно не ругайте, так как это первый проект написанный мной на ATL.
Заранее спасибо за ответы.
PM MAIL   Вверх
jonie
Дата 14.10.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



obiwan, возьмите в руки во первых oleview (идёт со студией), откройте в нем TypeLibrary (красненькие треугольнички), посмотрите на ваш EXE файл, там все ваши интерфейсы описаны? (мож не тот файл регистрируете, малоли)

Далее ищите в коде карту (BEGIN_COM_MAP) и покажите её нам .. ну и объявление кокласса не забудьте показать



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
obiwan
Дата 14.10.2009, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.7.2007
Где: Ukraine

Репутация: нет
Всего: нет



В EXE и TLB через OLEVIEW все интерфейсы видно.
Вот объявления кокласса:
Код

class ATL_NO_VTABLE CTempConverter :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CTempConverter, &CLSID_TempConverter>,
    public ITempConverter,
    public ICelsius,
    public IFahrenheit,
    public ITest,
    public ITest1
{
public:
    CTempConverter()
    {
    }

    DECLARE_REGISTRY_RESOURCEID(IDR_TEMPCONVERTER)

    DECLARE_NOT_AGGREGATABLE(CTempConverter)

    BEGIN_COM_MAP(CTempConverter)
        COM_INTERFACE_ENTRY(ITempConverter)
        COM_INTERFACE_ENTRY(ICelsius)
        COM_INTERFACE_ENTRY(IFahrenheit)
        COM_INTERFACE_ENTRY(ITest)
        COM_INTERFACE_ENTRY(ITest1)
    END_COM_MAP()



    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }

public:


    // ICelsius Methods
public:
    STDMETHOD(msgC)();
    STDMETHOD(toF)( double tC,  double * tF);

    // IFahrenheit Methods
public:
    STDMETHOD(msgF)();
    STDMETHOD(toC)( double tF,  double * tC);


    // ITest Methods
public:
    STDMETHOD(msgT1)()
    {
        cout << "ITest!\n";
        return S_OK;
    }

    //ITest1 Methods
public:
    STDMETHOD(msgT2)();
};

OBJECT_ENTRY_AUTO(__uuidof(TempConverter), CTempConverter)

PM MAIL   Вверх
jonie
Дата 15.10.2009, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



obiwan, IDL описание части coclass дайте. Там должно быть нечто вроде:
Код

coclass some
{
        [default] interface I1;
        interface I2;
}; 
да?


Это сообщение отредактировал(а) jonie - 15.10.2009, 00:24


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
obiwan
Дата 15.10.2009, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.7.2007
Где: Ukraine

Репутация: нет
Всего: нет



Код

[
    uuid(413ED269-2EFB-44C3-AF48-6A302FA50F32),
    version(1.0),
    helpstring("COMEXESvr3 1.0 Type Library")
]
library COMEXESvr3Lib
{
    importlib("stdole2.tlb");
    [
        uuid(B08E167E-AEDC-4B03-A0CF-2F2BBCD77F91),
        helpstring("TempConverter Class")
    ]
    coclass TempConverter
    {
        [default] interface ITempConverter;
        interface ICelsius;
        interface IFahrenheit;
        interface ITest;
        interface ITest1;
    };
};


PM MAIL   Вверх
obiwan
Дата 15.10.2009, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.7.2007
Где: Ukraine

Репутация: нет
Всего: нет



Разобрался. По тупости забыл зарегать Proxy/Stub dll. Спасибо jonie.
PM MAIL   Вверх
jonie
Дата 15.10.2009, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



obiwan, можно и не регить, если юзаете на одной машине... MyDll.Exe /RegServer


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 15.10.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(jonie @ 15.10.2009,  08:14)
obiwan, можно и не регить, если юзаете на одной машине... MyDll.Exe /RegServer

Если сервер в exe, то proxy dll все равно нужно регистрировать (если конечно ее сам .exe не зарегистрирует   smile )

PM MAIL   Вверх
jonie
Дата 15.10.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



xvr, а мне кажется ты ошибаешься.
в аттаче пример, усе работает как часы и без всяких DLL.


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  ATLTest.7z.doc 11,96 Kb


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 15.10.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(jonie @ 15.10.2009,  13:46)
xvr, а мне кажется ты ошибаешься.
в аттаче пример, усе работает как часы и без всяких DLL.

Не ошибаюсь - поменял в примере тип класса на 
Код

[
    object,
    uuid(8C53714B-BAB6-4892-8984-7A00F359D3C3),
    nonextensible,
    helpstring("IAtlTestClass Interface"),
    pointer_default(unique)
]
interface IAtlTestClass : IUnknown{
    [id(1),helpstring("method TestMethod")] HRESULT  TestMethod([in]BSTR s);
};
(убрал дуальность и IDispatch) и получил ошибку E_NOINTERFACE при попытке сделать QueryInterface (в com_ptr_t<>::CreateInstance)

Производные от IDispatch действительно не требуют proxy для работы, видимо COM система и так знает, что с ними делать  smile 
PM MAIL   Вверх
jonie
Дата 15.10.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



xvr, объяснить увиденное можешь научно ? Честно говоря никогда не делал не дуальных exe серверов....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 15.10.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(jonie @ 15.10.2009,  18:11)
xvr, объяснить увиденное можешь научно ? Честно говоря никогда не делал не дуальных exe серверов....

Объяснить не могу, могу только предполагать.
Во первых, для работы exe сервера в общем случае stub dll необходима, т.к. клиент и сервер  находятся в разных процессах и для вызова через границу процесса нужно выполнять маршалинг параметров и самого объекта. Собственно этим stub и занимается. Но есть 2 НО:
1. Если доступен typelib для объекта, то COM подсиситема в принципе может эти stub'ы построить сама (midl же собственно это и делает)
2. Если объект является IDispatch или dual интерфейсом, то вполне можно отмаршалить только IDispatch часть (она стандартная). Хотя с клиентской частью все равно будут проблемы :( К ней могут обратится не через IDispatch часть.

Скорее всего используется комбинация этих подходов - через IDispatch извлекают typelib и по ней динамически строят stub & proxy

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.