Ich versuche asynchron Funktion in meinem Add-on für Internet Explorer ausführen (ich schreibe BHO in VC++). Wie vorgeschlagen here Ich versuche CWorkerThread zu verwenden.Wie schreibe ich einfach Hintergrund Thread in CWorkerThread
Ich habe versucht, es stundenlang herauszufinden, aber immer noch keine Ahnung, wie es geht. Ich habe nicht viel Erfahrung in ATL. Das Fehlen von guten Dokumentationen oder Tutorials im Internet bringt mich um.
Ich erstelle Klasse durch Hinzufügen-> Klasse und wählen Sie ATL Simple Object (so fügen Sie als ATL-Projekt klassifiziert hinzu oder?). Aber wie implementiert man diesen IWorkerThreadClient? Ich dachte, dass die Auswahl von Add-> Implement Interface in der Klassenansicht gut ist, aber es gibt keinen IWorkerThreadClient in der Liste.
Ich glaube, ich weiß nicht, ATL oder COM enaugh kann aber nicht gute Ressource finden für das Erlernen dieser (esspessialy neueste ATL7).
Ich versuchte sogar winapi CreateThread
Ansatz, aber es funktioniert nicht. Ich übergebe this
Klassenzeiger, um statische Methode auszuführen, aber etwas beschädigt später mit Speicher. Wenn es trotzdem funktioniert hätte, würde ich lieber etwas anderes als CreateThread
verwenden.
Im Moment habe ich etwas wie this. In OnDocumentComplete
gibt es RemoveImages(sptmlDoc)
und ich möchte es nur asynchron ausführen.
EDIT: Was ich mit CreateThread
tat:
Ich versuchte RemoveImages Funktion (von here) asynchron ausgeführt wird. Ich habe statische Funktion in meiner Klasse mit Signatur wie here erstellt. RemoveImages hat Parameter so kopiert ich es auf ein Mitglied einer Klasse:
if (htmlDoc2 != NULL)
{
m_tmpHtmlDocument2 = htmlDoc2;
m_hThread = CreateThread(NULL, 0, MyThreadFunction, this, 0, &m_threadId);
}
und MyThreadFunction
:
static DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
CHelloWorldBHO* myClass = (CHelloWorldBHO*)lpParam;
myClass->RemoveImages(myClass->m_tmpHtmlDocument2);
return 0;
}
I „Nicht behandelte Ausnahme bei 0x60c0da05 in iexplore.exe erhalten: 0xC0000005: Zugriffsverletzung Leseort 0x000001b8 . " hier in der fett gedruckten Zeile:
void CHelloWorldBHO::DontDisplayElement(CComPtr htmlElement) { CComPtr style; HRESULT hr = htmlElement->get_style(&style); if (hr == S_OK && style != NULL) { static const CComBSTR strNone(L"none"); style->put_display(strNone); } }
würden Sie Beispiele wie [dieses] einen Blick (http://www.codeproject.com/KB/threads/CWorkerThread .aspx)? –
Ja, tat ich. Ich denke, dass dies und [dies] (http://msdn.microsoft.com/en-us/library/w849dybf.aspx) nur "gute" Quellen über diese Klasse sind. Aber ich habe Probleme damit. Ich kann nicht einmal eine einfache Klasse erstellen, die 'IWorkerThreadClient' implementiert, weil ich "Fehler C2504: 'IWorkerThreadClient': Basisklasse undefiniert" bekomme und ich '#include' hinzufüge. Ich kann es nur in Objekten implementieren, die von add-> class-> Atl Simple Object erstellt wurden. Ich kann es später nicht benutzen, weil ich keinen Zeiger auf die 'IWorkerThreadClient'-Schnittstelle bekommen kann, um es an 'AddHandle' zu übergeben. –