2016-08-15 52 views
8

Tôi đang cố gắng sử dụng giao diện COM trong một chuỗi. Từ những gì tôi đã đọc tôi phải gọi CoInitialize/CoUninitialize trong mỗi chủ đề.TThread và COM - "CoInitialize không được gọi là", mặc dù CoInitialize được gọi trong hàm dựng

Trong khi điều này đang làm việc tốt:

procedure TThreadedJob.Execute; 
begin 
    CoInitialize(nil); 

    // some COM stuff 

    CoUninitialize; 
end; 

khi tôi di chuyển các cuộc gọi đến constructor và destructor:

TThreadedJob = class(TThread) 
... 
    protected 
    procedure Execute; override; 
    public 
    constructor Create; 
    destructor Destroy; override; 
... 

constructor TThreadedJob.Create; 
begin 
    inherited Create(True); 
    CoInitialize(nil); 
end; 

destructor TThreadedJob.Destroy; 
begin 
    CoUninitialize; 
    inherited; 
end; 

procedure TThreadedJob.Execute; 
begin 

    // some COM stuff 

end; 

tôi nhận được EOleException: CoInitialize chưa được gọi là ngoại lệ và tôi không có đầu mối tại sao.

Trả lời

18

CoInitialize khởi tạo COM cho chuỗi thực hiện. Hằng số của một cá thể TThread thực thi trong chuỗi tạo ra cá thể TThread. Mã trong phương thức Execute thực hiện trong chuỗi mới.

Điều này có nghĩa là nếu bạn cần chuỗi TThreadedJob để khởi tạo COM, thì bạn phải gọi CoInitialize theo phương thức Execute. Hoặc một phương thức được gọi từ Execute. Sau đây là chính xác:

procedure TThreadedJob.Execute; 
begin 
    CoInitialize(nil); 
    try  
    // some COM stuff 
    finally 
    CoUninitialize; 
    end; 
end; 
+0

Cảm ơn bạn đã trả lời cực nhanh. – forsajt

Các vấn đề liên quan