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