Здравствуйте уважаемые...
Проблем в следующем.
Есть EXE — COM сервер в нем есть некий интефейс IExeServer, есть клиент который вызывает CoCreateInstance хотим получить интерфейс IExeServer передаю сформированный MIDL-ом IID_IExeServer и получаю в ответ E_NOINTERFACE.
Где я не прав.
Здравствуйте op, Вы писали:
op>Здравствуйте уважаемые... op>Проблем в следующем. op>Есть EXE — COM сервер в нем есть некий интефейс IExeServer, есть клиент который вызывает CoCreateInstance хотим получить интерфейс IExeServer передаю сформированный MIDL-ом IID_IExeServer и получаю в ответ E_NOINTERFACE. op>Где я не прав.
proxy/stub DLL или typelib нужен, чтоб данные маршаллить.
Если ты писал интерфейсы на IDL то и то и другое можно получить используя MIDL.
А может ты просто забыл зарегистрировать proxy/stub?
Здравствуйте op, Вы писали:
op>Есть EXE — COM сервер в нем есть некий интефейс IExeServer, есть клиент который вызывает CoCreateInstance хотим получить интерфейс IExeServer передаю сформированный MIDL-ом IID_IExeServer и получаю в ответ E_NOINTERFACE. op>Где я не прав.
Надо передавать не IID_IExeServer, а CLSID_ExeServer.
Первый параметр CoCreateInstance принимает гуид кокласса, грубо говоря — класса объекта. Четвёртый параметр принимает гуид интерфейса (IID_IExeServer), т.к. кокласс может иметь несколько интерфейсов. В реестре хранится описание класса, поэтому функция вполне законно выдаёт ошибку.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте Willi, Вы писали:
W>proxy/stub DLL или typelib нужен, чтоб данные маршаллить. W>Если ты писал интерфейсы на IDL то и то и другое можно получить используя MIDL.
W>А может ты просто забыл зарегистрировать proxy/stub?
Да. Похоже Willi прав. Дело в прокси. Проверить мжно так: запрашиваешь IUnknown* и если он получается, то дело именно в прокси.
Чтобы не возиться с прокси лучше создавая интерфейс делать его дуальным или помечать атрибутом oleautomation. При этом (естественно) надо испльзовать только automation-совместимые типы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте op, Вы писали:
op>Здравствуйте уважаемые... op>Проблем в следующем. op>Есть EXE — COM сервер в нем есть некий интефейс IExeServer, есть клиент который вызывает CoCreateInstance хотим получить интерфейс IExeServer передаю сформированный MIDL-ом IID_IExeServer и получаю в ответ E_NOINTERFACE. op>Где я не прав.
А разве TypLib не регистрится автоматически при компиляции проекта?
Отвечать на свое же сообщение не разумно. Отвечающие не получат уведомление...
op>Здравствуйте op, Вы писали:
op>>Здравствуйте уважаемые... op>>Проблем в следующем. op>>Есть EXE — COM сервер в нем есть некий интефейс IExeServer, есть клиент который вызывает CoCreateInstance хотим получить интерфейс IExeServer передаю сформированный MIDL-ом IID_IExeServer и получаю в ответ E_NOINTERFACE. op>>Где я не прав.
op>А разве TypLib не регистрится автоматически при компиляции проекта?
Так это зависит от проекта. ATL-визард делает кастом-билд-степ который действительно вызывает регистрацию сервера, при которой и регистрируется ТЛБ. Если проект создан как то по другому, то не факт. К тому же ваша ТЛБ может быть не совместима с олеатомэйшон. И E_NOINTERFACE очень часто является следствием этого.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.