Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Привет всем.
КД>Помогите, пожалуйста, разобраться в базой вещи — как из метода COM-объекта, написанного на шарпе, следует возвращать ошибки?
КД>Наверное, вообще никаких напрягов быть не должно. Но что-то не получается.
ComException не пробовал кидать? А так PreserveSig вполне работал, когда я с СОМом возился. Надо только явно return делать с нужным кодом и SetErrorInfo.
КД>Программа на плюсах, когда вызывает Method, получает код ошибки S_OK. Хотя ApplicationException содержит hr=COR_E_APPLICATION.
Так либо PreserveSig, либо ComException, а не все одновременно.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
КД>>Наверное, вообще никаких напрягов быть не должно. Но что-то не получается.
AVK>ComException не пробовал кидать? А так PreserveSig вполне работал, когда я с СОМом возился. Надо только явно return делать с нужным кодом и SetErrorInfo.
КД>>Программа на плюсах, когда вызывает Method, получает код ошибки S_OK. Хотя ApplicationException содержит hr=COR_E_APPLICATION.
AVK>Так либо PreserveSig, либо ComException, а не все одновременно.
Попробовал кидать ComException. Та же ботва
— с PreserveSig возвращается S_OK
— без PreserveSig — тупо валится.
Да оно и понятно. PreserveSig — это хрень которая подавляет генерацию ComException когда я вызываю интерфейсный метод.
А у меня же не вызов — это меня вызывают, и я должен вернуть код ошибки и объект с описанием ошибки.
AVK>Надо только явно return делать с нужным кодом и SetErrorInfo.
А в чем тогда профит, если надо писать явный код? Явный код и дурак напишет.
Может атрибут какой надо у методов замутить "трансляция_исключений_в_OleAutomationError"?
----
А как нахаляву передать .NET исключение в SetErrorInfo? Что-то я IErrorInfo в списке реализуемых интерфейсов не наблюдаю ... (пока ILSpy-ем в системных сборках копаюсь)
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Исключение из COM-объекта написанного на шарпе
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>А в чем тогда профит, если надо писать явный код?
Ни в чем. А почему ты решил что профит должен быть?
КД>А как нахаляву передать .NET исключение в SetErrorInfo? Что-то я IErrorInfo в списке реализуемых интерфейсов не наблюдаю ... (пока ILSpy-ем в системных сборках копаюсь)
Не знаю. Когда ты исключение кидаешь, то этим занимается CCW. А вот так чтобы исключение не кидать — не встречал. ILSpy тебе вряд ли поможет, CCW это нативный код.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>А в чем тогда профит, если надо писать явный код?
AVK>Ни в чем. А почему ты решил что профит должен быть?
Да VladD2 как-то мимоходом сказал, что на .NET писать комы проще.
КД>>А как нахаляву передать .NET исключение в SetErrorInfo? Что-то я IErrorInfo в списке реализуемых интерфейсов не наблюдаю ... (пока ILSpy-ем в системных сборках копаюсь)
AVK>Не знаю. Когда ты исключение кидаешь, то этим занимается CCW. А вот так чтобы исключение не кидать — не встречал. ILSpy тебе вряд ли поможет, CCW это нативный код.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Привет всем.
КД>Помогите, пожалуйста, разобраться в базовой вещью — как из метода COM-объекта, написанного на шарпе, следует возвращать ошибки?
КД>Наверное, вообще никаких напрягов быть не должно. Но что-то не получается.
КД>Есть код вида
Забыл сказать об одной вещи (наверное она важна) — я пишу не сервер COM-объектов, а обычный код, который хочет передать свой COM-объект (с данными) в другой COM-объект.
То есть снаружи этот TMyComInterface недоступен.
Возможно в этом есть какая-нибудь скрытая проблема...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: Исключение из COM-объекта написанного на шарпе
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Да VladD2 как-то мимоходом сказал, что на .NET писать комы проще.
Использование PreserveSig, да так чтобы еще и ErrorInfo потребовался, скажем так, не самая частая ситуация. Лично мне PreserveSig несколько раз был нужен, но всегда этобыла ситуация когда вокруг HResult была построена логика, а не потому что так ошибка возвращалась.
КД>Народ вроде говорит, что трансляция исключений осуществляется автоматически.
Правильно говорит. И ISupportErrorInfo CCW реализуент в полном объеме. Вот только транслируется оно в СОМ-исключение, которое, видимо, в твоем случае вызывающий код не обрабатывает.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Использование PreserveSig, да так чтобы еще и ErrorInfo потребовался, скажем так, не самая частая ситуация. Лично мне PreserveSig несколько раз был нужен, но всегда этобыла ситуация когда вокруг HResult была построена логика, а не потому что так ошибка возвращалась.
Мне нужен не PreserveSig, я его заюзал по-привычке (до сих пор я работал в обратном направлении — из .NET c "настоящими" COM-ами, написанными на плюсах). Мне нужно разобраться в том, как правильно реализуется COM-объект на C# (.NET). Собственно говоря, сам объект-то у меня работает. Непонятно как заставить фреймворк правильно обрабатывать исключения, которые внутри моего .NET COM-объекта генерируются.
КД>>Народ вроде говорит, что трансляция исключений осуществляется автоматически.
AVK>Правильно говорит. И ISupportErrorInfo CCW реализуент в полном объеме. Вот только транслируется оно в СОМ-исключение, которое, видимо, в твоем случае вызывающий код не обрабатывает.
Вызывающая сторона (это код на плюсах) как минимум обрабатывает код ошибки. CCW, по идее, должен был выдрать код ошибки из исключения и вернуть его. Но он почему-то это не делает (хотя и ловит исключения) и всегда возвращает S_OK.
Ладно, утро вечера мудреннее. Может завтра что в голову новое прийдет
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[7]: Исключение из COM-объекта написанного на шарпе
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Мне нужно разобраться в том, как правильно реализуется COM-объект на C# (.NET).
Правильно — это полностью положиться на CCW. Обычно в вызывающем коде SEH присутствует. А вот если CCW не устраивает — тут уж рукопашный трах по полной.
КД>Непонятно как заставить фреймворк правильно обрабатывать исключения, которые внутри моего .NET COM-объекта генерируются.
Причем тут фреймворк? Фреймворк делает совершенно тривиальную вещь — конвертирует исключение в понятное СОМ. Т.е. в большинстве случаев ты просто кидаешь исключение и дальнейшее — не твоя забота.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
1. Убираем PreserveSig.
2. Вместо HResultCode возвращаем viod.
3. В C#-коде об ошибках сообщаем, бросая исключения.
4. В C++-коде импортируем (#import) tlb с атрибутом raw_interfaces_only. В этом случае исключения будут транслироваться в HRESULT. Без этого атрибута будет выбрасываться _com_error.
Re[2]: Исключение из COM-объекта написанного на шарпе
Здравствуйте, breee breee, Вы писали:
BB>1. Убираем PreserveSig. BB>2. Вместо HResultCode возвращаем viod. BB>3. В C#-коде об ошибках сообщаем, бросая исключения.
Ага, спасибо!
Попробовал кидать ComException с E_FAIL и S_FALSE — вызывающая сторона на плюсах получает их без проблем. ApplicationException c его COR_E_APPLICATION — тоже нормально обрабатывается.
Похоже это — ПОБЕДА!
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Исключение из COM-объекта написанного на шарпе
Здравствуйте, Коваленко Дмитрий, Вы писали:
BB>>1. Убираем PreserveSig. BB>>2. Вместо HResultCode возвращаем viod. BB>>3. В C#-коде об ошибках сообщаем, бросая исключения.
КД>Ага, спасибо!
КД>Попробовал кидать ComException с E_FAIL и S_FALSE — вызывающая сторона на плюсах получает их без проблем. ApplicationException c его COR_E_APPLICATION — тоже нормально обрабатывается.
Я допёр
1. Почему у меня валился процесс без PreserveSig, но с возвратом com.HResultCode через return. CCW (по ходу) обрабатывало этот return как некий OUT-параметр метода и убивало стек.
2. Почему CCW (когда указан PreserveSig) не пытается выдрать из исключения код ошибки и вернуть его. Потому что PreserveSig означает "не трогай моё возвращаемое значение из функции". Соответственно, CCW и не пытается это делать — вдруг я возвращаю не HRESULT, а (к примеру) LCPWSTR. А S_OK (ноль) возвращается потому что CCW использовало это значение для инициализации результата перед вызовом метода.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>1. Почему у меня валился процесс без PreserveSig, но с возвратом com.HResultCode через return. CCW (по ходу) обрабатывало этот return как некий OUT-параметр метода и убивало стек.
Мне, честно говоря, даже в голову не пришло, что ты PreserveSig убрал, а возвращаемое значение оставил.
КД>2. Почему CCW (когда указан PreserveSig) не пытается выдрать из исключения код ошибки и вернуть его. Потому что PreserveSig означает "не трогай моё возвращаемое значение из функции".
Именно так.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>