В моем консольном приложении используется стороннее (не Microsoft) приложение, которое обеспечивает функциональность COM-сервера.Я реализовал интерфейс IMessageFilter
способом, описанным здесь .
От интерфейса я ожидаю, что когда COM-объект выполняет какую-либо задачу и не может, например, немедленно выйти из моего запроса от другогоон будет непрерывно вызывать RetryRejectedCall()
и ждать, пока объект освободится.
Тем не менее, я вижу, что он не работает, как это, но вместо этого выдает COMException
, где я пытаюсь закрыть снова и снова.И после того, как я получаю OnQuit
событие от COM-объекта, он вызывает RetryRejectedCall()
со значением 2 (SERVERCALL_RETRYLATER
).
Мой журнал выглядит следующим образом:
Info: COM - opening project 'MyProject'...
Info: Console_CancelKeyPress event fired. // I pressed ctrl+c
Info: COM - quitting... (attempt 1) // quit() called from another thread
Error: COM - failed to close, it might be busy.
Info: COM - quitting... (attempt 2)
Info: COM - project 'MyProject' opened.
Info: COM - quit successfully // quit only after open operation complete
Debug: RetryRejectedCall: dwRejectType=2
Debug: Test run thread is being aborted
Info: COM - quit successfully // why quit again?
Вопросы:
- Верны ли мои ожидания или у него есть другая функциональность?
- Должен ли я реализовывать
IMessageFilter
для приложений, которые вообще работают с COM-объектами?В моем случае все работает как было без интерфейса.