ATL DCOM Server - всегда E_NOINTREFACE
От: The Lex Украина  
Дата: 05.08.02 07:46
Оценка:
Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.

Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...
Голь на выдумку хитра, однако...
Re: ATL DCOM Server - всегда E_NOINTREFACE
От: Tom Россия http://www.RSDN.ru
Дата: 05.08.02 09:11
Оценка:
Здравствуйте The Lex, Вы писали:

TL>Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.


TL>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...


Значит это, что скорее всего, что ты не правильно используешь фабрику класса. Скорее всего ты делаешь:
1. CoCreateInstanceEx...
2. QueryInterface "Твой интерфейс"
а надо
1. CoCreateInstanceEx(...IID_IClassFactory...)
2. CF->CreateInstance(NULL,"Твой интерфейс",...)
Народная мудрось
всем все никому ничего(с).
Re: ATL DCOM Server - всегда E_NOINTREFACE
От: Vi2 Удмуртия http://www.adem.ru
Дата: 05.08.02 09:16
Оценка: 5 (1)
Здравствуйте The Lex, Вы писали:

TL>Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.

TL>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...

Всегда E_NOINTREFACE будет возвращаться, если не зарегистрирована прокси/стаб или на машине сервера объекта или на машине клиента.

А IUnknown-то должна передать объект. Попробуй этот интерфейс. А потом через него QueryInterface на свой. Если будет та же ошибка — в этом и дело.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: ATL DCOM Server - всегда E_NOINTREFACE
От: Ivan Россия www.rsdn.ru
Дата: 05.08.02 09:16
Оценка:
Здравствуйте The Lex, Вы писали:

TL>Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.


TL>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...


Скорее всего, проблема в маршалинге.

интерфейс помечен атрибутом "dual" или "oleatomation" ? если нет, то надо скомпилировать proxy/stub, чтобы был возможен маршалинг в другой процесс/другой хост
Re[2]: ATL DCOM Server - всегда E_NOINTREFACE
От: The Lex Украина  
Дата: 05.08.02 09:33
Оценка:
Здравствуйте Tom, Вы писали:

Tom>Здравствуйте The Lex, Вы писали:


TL>>Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.


TL>>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...


Tom>Значит это, что скорее всего, что ты не правильно используешь фабрику класса. Скорее всего ты делаешь:

Tom> 1. CoCreateInstanceEx...
Tom> 2. QueryInterface "Твой интерфейс"
Tom>а надо
Tom> 1. CoCreateInstanceEx(...IID_IClassFactory...)
Tom> 2. CF->CreateInstance(NULL,"Твой интерфейс",...)

    COSERVERINFO ServerInfo;

    ServerInfo.dwReserved1 = 0;
    ServerInfo.dwReserved2 = 0;
    ServerInfo.pAuthInfo = NULL;

    ServerInfo.pwszName = L"SERVER_NAME";

    MULTI_QI mq[1];
    mq[0].hr = S_OK;
    mq[0].pIID = &IID_IPOSCfgSomeShit;
    mq[0].pItf = NULL;

    hr = ::CoCreateInstanceEx(
        CLSID_POSCfgServer,
        NULL,
        CLSCTX_ALL,
        &ServerInfo,
        1,
        mq);
Голь на выдумку хитра, однако...
Re[2]: ATL DCOM Server - всегда E_NOINTREFACE
От: The Lex Украина  
Дата: 05.08.02 09:35
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте The Lex, Вы писали:


TL>>Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.

TL>>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...

Vi2>Всегда E_NOINTREFACE будет возвращаться, если не зарегистрирована прокси/стаб или на машине сервера объекта или на машине клиента.


Vi2>А IUnknown-то должна передать объект. Попробуй этот интерфейс. А потом через него QueryInterface на свой. Если будет та же ошибка — в этом и дело.


Да, точно так! IUnknown получаю, потом запрашиваю свой — снова E_NOINTERFACE. Хорошо, попробую прокси/стаб...
Голь на выдумку хитра, однако...
Re[3]: ATL DCOM Server - всегда E_NOINTREFACE
От: Tom Россия http://www.RSDN.ru
Дата: 05.08.02 09:57
Оценка:
Попробуй так.
TL>
    COSERVERINFO ServerInfo;

    ServerInfo.dwReserved1 = 0;
    ServerInfo.dwReserved2 = 0;
    ServerInfo.pAuthInfo = NULL;

    ServerInfo.pwszName = L"SERVER_NAME";

    MULTI_QI mq[1];
    mq[0].hr = S_OK;
    mq[0].pIID = &IID_IClassFactory;
    mq[0].pItf = NULL;

    hr = ::CoCreateInstanceEx(
        CLSID_POSCfgServer,
        NULL,
        CLSCTX_ALL,
        &ServerInfo,
        1,
        mq);

   if (!FAILED(pItf))
   {
       IMyInterface * pIMyInterface = NULL;
       hr = mq[0].pItf->CreateInstance(NULL, IID_IMyInterface, &pIMyInterface)
       ...
   }
Народная мудрось
всем все никому ничего(с).
Re: ATL DCOM Server - всегда E_NOINTREFACE
От: Аноним  
Дата: 05.08.02 10:04
Оценка:
Здравствуйте The Lex, Вы писали:

TL>Что бы это могло значить? :???: Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.


TL>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...


скорее всего не зарегистрирована proxy/stub dll. но в таком случае IUnknown возвращается а на все остальные интерфейсы выдается E_NOINTERFACE
Re[4]: Класс-фактори тут не причём.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 05.08.02 10:13
Оценка: 3 (1)
Здравствуйте Tom, Вы писали:

Tom> mq[0].pIID = &IID_IClassFactory;

...
Tom> hr = ::CoCreateInstanceEx(CLSID_POSCfgServer,NULL,CLSCTX_ALL,&ServerInfo,1,mq);

Таким путём класс-фактори не получают н-и-к-о-г-д-а. CoCreateInstance служит для получения экземпляра объекта.

Для этого есть CoGetClassObject (а не CoCreateInstance/CoCreateInstanceEx).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Класс-фактори тут не причём.
От: Tom Россия http://www.RSDN.ru
Дата: 05.08.02 10:22
Оценка:
Vi2>Таким путём класс-фактори не получают н-и-к-о-г-д-а. CoCreateInstance служит для получения экземпляра объекта.
Видать старею
Хотя точно помню, что когда то мне именно так и приходилось делать.
Народная мудрось
всем все никому ничего(с).
Re[3]: ATL DCOM Server - всегда E_NOINTREFACE
От: George_Seryakov Россия  
Дата: 05.08.02 14:57
Оценка: 5 (1)
Здравствуйте The Lex, Вы писали:

TL>
TL>    COSERVERINFO ServerInfo;

TL>    ServerInfo.dwReserved1 = 0;
TL>    ServerInfo.dwReserved2 = 0;
TL>    ServerInfo.pAuthInfo = NULL;

TL>    ServerInfo.pwszName = L"SERVER_NAME";

TL>    MULTI_QI mq[1];
TL>    mq[0].hr = S_OK;
TL>    mq[0].pIID = &IID_IPOSCfgSomeShit;
TL>    mq[0].pItf = NULL;

TL>    hr = ::CoCreateInstanceEx(
TL>        CLSID_POSCfgServer,
TL>        NULL,
TL>        CLSCTX_ALL,
TL>        &ServerInfo,
TL>        1,
TL>        mq);
TL>


Почему-то так мне больше нравится:

    COSERVERINFO ServerInfo = { 0, 0, NULL, L"SERVER_NAME" };

    MULTI_QI mq = { S_OK, &IID_IPOSCfgSomeShit, NULL };

    hr = ::CoCreateInstanceEx(
        CLSID_POSCfgServer,
        NULL,
        CLSCTX_ALL,
        &ServerInfo,
        1,
        &mq);
GS
Re[4]: ATL DCOM Server - всегда E_NOINTREFACE
От: The Lex Украина  
Дата: 05.08.02 15:05
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Здравствуйте The Lex, Вы писали:


TL>>
TL>>    COSERVERINFO ServerInfo;

TL>>    ServerInfo.dwReserved1 = 0;
TL>>    ServerInfo.dwReserved2 = 0;
TL>>    ServerInfo.pAuthInfo = NULL;

TL>>    ServerInfo.pwszName = L"SERVER_NAME";

TL>>    MULTI_QI mq[1];
TL>>    mq[0].hr = S_OK;
TL>>    mq[0].pIID = &IID_IPOSCfgSomeShit;
TL>>    mq[0].pItf = NULL;

TL>>    hr = ::CoCreateInstanceEx(
TL>>        CLSID_POSCfgServer,
TL>>        NULL,
TL>>        CLSCTX_ALL,
TL>>        &ServerInfo,
TL>>        1,
TL>>        mq);
TL>>


GS>Почему-то так мне больше нравится:


GS>
GS>    COSERVERINFO ServerInfo = { 0, 0, NULL, L"SERVER_NAME" };

GS>    MULTI_QI mq = { S_OK, &IID_IPOSCfgSomeShit, NULL };

GS>    hr = ::CoCreateInstanceEx(
GS>        CLSID_POSCfgServer,
GS>        NULL,
GS>        CLSCTX_ALL,
GS>        &ServerInfo,
GS>        1,
GS>        &mq);
GS>


Ну, на то Вы и George_Seryakov, а я — просто The Lex.
Мне мой метод больше нравится потому, что я лучше вижу, что чему присваивается — это раз. А два: имя сервера все ж предполагается задавать не внутре кода, а извне оного, тобишь от юзера исходяще. Но я учту! Для заполнения массива MILTI_QI это и правда посимпатишнее будет. Хотя...
Голь на выдумку хитра, однако...
Re[4]: ATL DCOM Server - всегда E_NOINTREFACE
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 05.08.02 20:02
Оценка:
Здравствуйте Tom, Вы писали:

    hr = ::CoCreateInstanceEx(
        CLSID_POSCfgServer,
        NULL,
        CLSCTX_ALL,
        &ServerInfo,
        1,
        mq);


Вместо CLSCTX_ALL для удаленного создания надо использовать CLSCTX_REMOTE_SERVER, при исользовании CLSCTX_ALL, CoCreateInstanceEx создает объект на локальном компе (если конечно объект на локальном компе зареген тоже).
Re[5]: ATL DCOM Server - всегда E_NOINTREFACE
От: The Lex Украина  
Дата: 05.08.02 20:06
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Tom, Вы писали:


DG>
DG>    hr = ::CoCreateInstanceEx(
DG>        CLSID_POSCfgServer,
DG>        NULL,
DG>        CLSCTX_ALL,
DG>        &ServerInfo,
DG>        1,
DG>        mq);

DG>


DG>Вместо CLSCTX_ALL для удаленного создания надо использовать CLSCTX_REMOTE_SERVER, при исользовании CLSCTX_ALL, CoCreateInstanceEx создает объект на локальном компе (если конечно объект на локальном компе зареген тоже).


А потом догоняет и еще раз создает. Прошу прощения: поздно уже, спать иду, а тут такой постинг. Сервер для запуска... хм... DCOM-сервера определяется в ServerInfo.pwszName... Пробовал: точно работает. Называть локальный "LOCALHOST" не пробовал: может завтра попробую...
Голь на выдумку хитра, однако...
Re[6]: ATL DCOM Server - всегда E_NOINTREFACE
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 05.08.02 20:12
Оценка:
Здравствуйте The Lex, Вы писали:


TL>А потом догоняет и еще раз создает. Прошу прощения: поздно уже, спать иду, а тут такой постинг. Сервер для запуска... хм... DCOM-сервера определяется в ServerInfo.pwszName...


В некоторых случаях это имя не смотрится...

Трабла была такая:
есть InProc-объект, который при создании поднимает exe-singleton.

Так вот если при создании inproc-объекта на другом компе указать CLSCTX_ALL, то exe-singleton поднимается на локальном компьютере.

Если указывать CLSCTX_REMOTE_SERVER, то все нормально, exe-singleton поднимается там, где ему и положено, на другом компе.

TL>Пробовал: точно работает. Называть локальный "LOCALHOST" не пробовал: может завтра попробую...
Re[7]: ATL DCOM Server - всегда E_NOINTREFACE
От: The Lex Украина  
Дата: 05.08.02 20:16
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте The Lex, Вы писали:



TL>>А потом догоняет и еще раз создает. Прошу прощения: поздно уже, спать иду, а тут такой постинг. Сервер для запуска... хм... DCOM-сервера определяется в ServerInfo.pwszName...


DG>В некоторых случаях это имя не смотрится...


DG>Трабла была такая:

DG>есть InProc-объект, который при создании поднимает exe-singleton.

DG>Так вот если при создании inproc-объекта на другом компе указать CLSCTX_ALL, то exe-singleton поднимается на локальном компьютере.


DG>Если указывать CLSCTX_REMOTE_SERVER, то все нормально, exe-singleton поднимается там, где ему и положено, на другом компе.


К сожалению, весьма смутно представляю себе, что такое "singleton"... Завтра займусь RTFM. А пока, можно я Экслера дочитаю и спать пойду, а?
Голь на выдумку хитра, однако...
Re: ATL DCOM Server - всегда E_NOINTREFACE
От: Kef Россия  
Дата: 06.08.02 07:06
Оценка:
Здравствуйте The Lex, Вы писали:

TL>Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.


TL>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...


инитерфейс не зарегистрирован ... вот в чем проблемка то ...

покажи как совй idl файл для COM сервера ... покажешь — узнаешь в чем проблема
Re[2]: ATL DCOM Server - всегда E_NOINTREFACE
От: The Lex Украина  
Дата: 06.08.02 07:21
Оценка:
Здравствуйте Kef, Вы писали:

Kef>Здравствуйте The Lex, Вы писали:


TL>>Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.


TL>>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...


Kef>инитерфейс не зарегистрирован ... вот в чем проблемка то ...


Kef>покажи как совй idl файл для COM сервера ... покажешь — узнаешь в чем проблема


import "oaidl.idl";
import "ocidl.idl";

    [
        object,
        uuid(9592955D-A5F0-11D6-A088-0048541E5CCB),

        helpstring("IPOSCfgServer Interface"),
        pointer_default(unique)
    ]
    interface IPOSCfgServer : IUnknown
    {
    };

[
    uuid(95929551-A5F0-11D6-A088-0048541E5CCB),
    version(1.0),
    helpstring("POSConfigServer 1.0 Type Library")
]
library POSCONFIGSERVERLib
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    [
        uuid(9592955E-A5F0-11D6-A088-0048541E5CCB),
        helpstring("POSCfgServer Class")
    ]
    coclass POSCfgServer
    {
        [default] interface IPOSCfgServer;
    };
};


Только проблема уже решилась сбором proxy/stub DLL и ее регистрацией. Только что всплыла новая, после чего компиляция proxy/stub была записана в Custom Build и более не "возникала".
Голь на выдумку хитра, однако...
Re[3]: ATL DCOM Server - всегда E_NOINTREFACE
От: Kef Россия  
Дата: 06.08.02 09:07
Оценка:
Здравствуйте The Lex, Вы писали:

TL>Здравствуйте Kef, Вы писали:


Kef>>Здравствуйте The Lex, Вы писали:


TL>>>Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.


TL>>>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...


Kef>>инитерфейс не зарегистрирован ... вот в чем проблемка то ...


Kef>>покажи как совй idl файл для COM сервера ... покажешь — узнаешь в чем проблема


TL>
TL>import "oaidl.idl";
TL>import "ocidl.idl";

TL>    [
TL>        object,
TL>        uuid(9592955D-A5F0-11D6-A088-0048541E5CCB),

TL>        helpstring("IPOSCfgServer Interface"),
TL>        pointer_default(unique)
TL>    ]
TL>    interface IPOSCfgServer : IUnknown
TL>    {
TL>    };

TL>[
TL>    uuid(95929551-A5F0-11D6-A088-0048541E5CCB),
TL>    version(1.0),
TL>    helpstring("POSConfigServer 1.0 Type Library")
TL>]
TL>library POSCONFIGSERVERLib
TL>{
TL>    importlib("stdole32.tlb");
TL>    importlib("stdole2.tlb");

TL>    [
TL>        uuid(9592955E-A5F0-11D6-A088-0048541E5CCB),
TL>        helpstring("POSCfgServer Class")
TL>    ]
TL>    coclass POSCfgServer
TL>    {
TL>        [default] interface IPOSCfgServer;
TL>    };
TL>};
TL>


TL>Только проблема уже решилась сбором proxy/stub DLL и ее регистрацией. Только что всплыла новая, после чего компиляция proxy/stub была записана в Custom Build и более не "возникала".


Ну да ... именно в этом то вся проблема и была судя по потому как у тебя объявлен интерфейся ... IUnknown как базовый ... стандартный маршалинг ... раньше тоже удивлялся таким вот ошибкам
Re: ATL DCOM Server - всегда E_NOINTREFACE
От: Reostat Россия  
Дата: 26.05.05 11:37
Оценка:
Здравствуйте, The Lex, Вы писали:

TL>Что бы это могло значить? Сам я ничего не нашел — это мой первый DCOM-сервер на ATL.


TL>Сервер скомпонован как сервис. Если нужна будет дополнительная информация — отвечу...


Господа! вот тут
Автор: Reostat
Дата: 26.05.05
я запостил новую информацию по этому вопросу...
...бабочки, курицы и прочие травоядные.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.