В вашем методе Execute()
вы должны вызвать CoInitialize
и CoUnitialize
для настройки и демонтажа библиотеки COM.
Ваш основной поток автоматически делает это в процедуре Application.Initialize()
, однако другие потоки требуют вызова CoInitialize
перед вызовом функций COM.
Убедитесь, что вы вызываете CoInitialize
в методе Execute()
, а не в конструкторе, потому что конструктор выполняется в родительском потоке (обычно в основном потоке). Это не там, где вам это нужно. Он должен вызываться из потока, из которого вы планируете делать вызовы COM.
Я рекомендую использовать этот формат:
try
// OleCheck will raise an error if the call fails
OleCheck(CoInitializeEx(NIL, COINIT_MULTITHREADED or COINIT_SPEED_OVER_MEMORY));
try
// Do work here
finally
CoUninitialize;
end;
except
// We failed, do something
end;
Это позволяет вам перехватить ошибку, если она не инициализируется, и гарантирует, что вы вызываете CoUninitialize
.