Я пытаюсь асинхронно запустить функцию в моем дополнении для Internet Explorer (я пишу BHO в VC ++).Как и предполагалось здесь Я пытаюсь использовать CWorkerThread.
Я пытался разобраться с этим часами, но до сих пор не знаю, как это сделать.У меня нет большого опыта в ATL.Отсутствие хорошей документации или учебных пособий в Интернете убивает меня.
Я создаю класс с помощью Add-> Class и выбираю простой объект ATL (именно так вы добавляете класс в ATL-проект, верно?).Но как реализовать этот IWorkerThreadClient?Я подумал, что было бы неплохо выбрать Add-> Implement Interface в Class View, но в списке нет IWorkerThreadClient.
Я думаю, что не знаю ATL или COM, но не могу найти хороший ресурс для обученияэто (особенно новейший ATL7).
Я даже попробовал подход winapi CreateThread
, но он не работает.Я передаю указатель класса this
для запуска статического метода, но что-то портится с памятью позже.Тем не менее, если бы это сработало, я все равно предпочел бы использовать что-то еще, чем CreateThread
.
Прямо сейчас у меня есть что-то вроде this .В OnDocumentComplete
есть RemoveImages(sptmlDoc)
, и я просто хочу запустить его асинхронно.
РЕДАКТИРОВАТЬ: Что я сделал с CreateThread
:
Я попытался запустить функцию RemoveImages(с здесь ) асинхронно.Я создал статическую функцию в своем классе с подписью как здесь .У параметра RemoveImages есть параметр, поэтому я скопировал его в член класса:
if (htmlDoc2 != NULL)
{
m_tmpHtmlDocument2 = htmlDoc2;
m_hThread = CreateThread( NULL, 0, MyThreadFunction, this, 0, &m_threadId);
}
и MyThreadFunction
:
static DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
CHelloWorldBHO* myClass = (CHelloWorldBHO*)lpParam;
myClass->RemoveImages(myClass->m_tmpHtmlDocument2);
return 0;
}
Я получаю необработанное исключение в 0x60c0da05 в iexplore.exe: 0xC0000005: Место чтения нарушения доступа 0x000001b8. "здесь жирной линией:
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");
<b>style->put_display(strNone);</b>
}
}