Как безопасно предотвратить / прекратить зависание потока Win32 / COM, не прерывая процесс? - PullRequest
0 голосов
/ 05 июня 2019

Как вы можете вызвать неисправный внепроцессный COM-сервер, который вызывает случайное зависание его клиентов при вызове его методов ( без уничтожения клиентского процесса)?

Рассмотрим процесскоторый порождает рабочий поток, инициализирует STA COM, получает ошибочный COM-объект и затем начинает вызывать его методы, пока они не зависнут.Как можно предотвратить или прервать зависание?

Наивным решением является вызов TerminateThread, если поток не отвечает в течение определенного времени.Но Microsoft указывает здесь , что каждый поток, вызывающий CoInitializeEx, должен вызвать CoUninitialize или рискнуть утечкой ресурсов, и TerminateThread пропускает это.(Примечание: является ли CoUninitialize ненужным, если поток завершен?)

Если это буквально неразрешимо с общедоступными API-интерфейсами Windows, я открыт для недокументированных / внутренних средств и подделки ОС.Можно ли что-то заменить тем, что Ole32.dll намеревается вернуть в поток?Это даже сделано в Ole32.dll?Или заставить Windows пробудить поток с поддельными данными?(Предположим, что другие потоки также используют свои собственные STA COM).

...