2016-08-15 16 views
8

में बुलाया जाता है, मैं थ्रेड के भीतर COM इंटरफ़ेस का उपयोग करने का प्रयास कर रहा हूं। मैंने जो पढ़ा है, उससे मुझे प्रत्येक थ्रेड में CoInitialize/CoUninitialize पर कॉल करना होगा।टीटीएचड और COM - "CoInitialize को नहीं कहा गया है", हालांकि CoInitialize को निर्माता

इस जबकि ठीक काम कर रहा है:

procedure TThreadedJob.Execute; 
begin 
    CoInitialize(nil); 

    // some COM stuff 

    CoUninitialize; 
end; 

जब मैं निर्माता के लिए कॉल और नाशक के लिए कदम: CoInitialize नहीं बुलाया गया है अपवाद और मुझे पता नहीं है:

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; 

मैं EOleException मिल सुराग क्यों

उत्तर

18

CoInitialize निष्पादन थ्रेड के लिए COM प्रारंभ करता है। TThread उदाहरण का कंसक्टर थ्रेड में निष्पादित करता है जो TThread उदाहरण बनाता है। Execute विधि में कोड नए धागे में निष्पादित करता है।

इसका मतलब है कि अगर आपको TThreadedJob धागा प्रारंभ करने के लिए थ्रेड की आवश्यकता है, तो आपको Execute विधि में CoInitialize पर कॉल करना होगा। या Execute से बुलाया गया एक तरीका। निम्नलिखित सही है:

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

बिजली के तेज उत्तर के लिए धन्यवाद। – forsajt

संबंधित मुद्दे