удаление метода COM-интерфейса
От: PavelT100 Россия  
Дата: 19.11.14 17:55
Оценка:
Есть COM-интерфейс в EXE-модуле, написанный на C++.
Клиент, использующий эти методы, написанный на C#.
Увидел, что одна из функций COM-интерфейса не используется на клиенте. Решил её вообе удалить.
Удалил эту функцию из idl-файла.

[
    object,
    uuid(416AF068-2ABF-4F20-BC61-1163A7600433),
    dual,
    nonextensible,
    helpstring("IcomAAAA Interface"),
    pointer_default(unique)
]
interface IWinPharma : IDispatch{
    [id(1), helpstring("method AAAA")] HRESULT AAAA([in] BSTR query, [in] BSTR query_cleanup);  //вот эту строку я удалил
    [id(2), helpstring("method BBBB")] HRESULT BBBB([in] BSTR query);
.....

уменьшил id на 1.

удалил саму функцию из кода C++:

STDMETHOD(AAAA)(BSTR query, BSTR cleanup)
    {
...
    }


На С#-клиенте удалил описание этой функции:
[Guid("416AF068-2ABF-4F20-BC61-1163A7600433")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IWinPharma
    {
        int AAAA(
            [In, MarshalAs(UnmanagedType.BStr)] string query, 
            [In, MarshalAs(UnmanagedType.BStr)] string query_cleanup);

        void BBBB([In, MarshalAs(UnmanagedType.BStr)] string query);
....


Всё компилируется. Сервер EXE запускается. Но при запуске клиента падает на первом же вызове COM-функции. Что надо ещё удалить или исправить?
Re: удаление метода COM-интерфейса
От: jahr  
Дата: 19.11.14 19:05
Оценка:
Здравствуйте, PavelT100, Вы писали:

Возможно, нужно пересобрать proxystub для exe-сервера (дополнительный проект с именем "имя_exePS.dll").
Re: удаление метода COM-интерфейса
От: mDmitriy Россия  
Дата: 20.11.14 07:32
Оценка:
Здравствуйте, PavelT100, Вы писали:
PT>Всё компилируется. Сервер EXE запускается. Но при запуске клиента падает на первом же вызове COM-функции. Что надо ещё удалить или исправить?
tlb?
Re[2]: удаление метода COM-интерфейса
От: PavelT100 Россия  
Дата: 20.11.14 08:40
Оценка:
Здравствуйте, mDmitriy, Вы писали:

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

D>tlb?

Да. MIDL запускается и делает всё, что полагается, 4 новых текстовых файла AutoSvr.h, AutoSvr_i.c, AutoSvr_p.c, dlldata.c, в них уже нет упоминаний о моей удалённой функции и создаётся новый tlb файл.
Отредактировано 20.11.2014 8:41 PavelT100 . Предыдущая версия .
Re[2]: удаление метода COM-интерфейса
От: PavelT100 Россия  
Дата: 20.11.14 09:28
Оценка:
Здравствуйте, jahr, Вы писали:

J>Возможно, нужно пересобрать proxystub для exe-сервера (дополнительный проект с именем "имя_exePS.dll").


Такого проекта у меня в решении для exe-сервера нет и такой dll тоже нет.
Отредактировано 20.11.2014 9:42 PavelT100 . Предыдущая версия .
Re: удаление метода COM-интерфейса
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.11.14 22:41
Оценка:
Здравствуйте, PavelT100, Вы писали:

PT>Есть COM-интерфейс в EXE-модуле, написанный на C++.

PT>Клиент, использующий эти методы, написанный на C#.
PT>Увидел, что одна из функций COM-интерфейса не используется на клиенте. Решил её вообе удалить.
PT>Удалил эту функцию из idl-файла.

PT>Всё компилируется. Сервер EXE запускается. Но при запуске клиента падает на первом же вызове COM-функции. Что надо ещё удалить или исправить?


На что стоит ссылка в C# проекте? Может Interop не перегенерился (или старый используется)
Удалить-добавить ссылку в C# проекте на свою DLL не пробовал (тогда студия сделает новый интероп)?
Re: удаление метода COM-интерфейса
От: Alexander G Украина  
Дата: 24.11.14 11:14
Оценка:
Здравствуйте, PavelT100, Вы писали:

PT>Всё компилируется. Сервер EXE запускается. Но при запуске клиента падает на первом же вызове COM-функции. Что надо ещё удалить или исправить?


Честно поменять GUID, и всё, что нужно, перегенерится само.
Русский военный корабль идёт ко дну!
Re: удаление метода COM-интерфейса
От: DiZSl  
Дата: 30.11.14 11:19
Оценка:
Здравствуйте, PavelT100, Вы писали:

Как минимум уменьшать "id на 1" не стоило.
Re: удаление метода COM-интерфейса
От: Mr.Delphist  
Дата: 10.02.15 16:50
Оценка:
Здравствуйте, PavelT100, Вы писали:

PT>Есть COM-интерфейс в EXE-модуле, написанный на C++.

PT>Клиент, использующий эти методы, написанный на C#.
PT>Увидел, что одна из функций COM-интерфейса не используется на клиенте. Решил её вообе удалить.
PT>Удалил эту функцию из idl-файла.

Никогда не удаляйте методы из уже опубликованных COM-интерфейсов. Если же публичного релиза сервера с этим методом ещё не было, то
* убедиться с помощью любого TLB viewer, что метод пропал из интерфейса (и прокси/диспатч-интерфейсов, связанных с ним)
* удалить старую interop-ассембли и сгенерить новую из свежего билда COM-сервера
Re: удаление метода COM-интерфейса
От: tapatoon  
Дата: 14.02.15 11:02
Оценка:
Здравствуйте, PavelT100, Вы писали:

>PT На С#-клиенте удалил описание этой функции:


Почему в C# пришлось что-то делать? Я подключал в Reference сгенерённый tlb и все автоматом обновлялось (При изменении интерфейса приходилось reference передобавлять, т.к. студия не детектила изменения).
Центр ИПсО Сил Специальных Операций
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.