【发布时间】:2011-05-16 17:30:16
【问题描述】:
我正在尝试在我的 Internet Explorer 插件中异步运行函数(我正在用 VC++ 编写 BHO)。正如 here 建议的那样,我正在尝试使用 CWorkerThread。
我已经尝试了好几个小时,但仍然不知道该怎么做。我在 ATL 方面没有太多经验。互联网上缺乏好的文档或教程正在扼杀我。
我正在通过 Add->Class 创建类并选择 ATL Simple Object(这就是您将类添加到 ATL 项目的方式对吗?)。但是如何实现这个 IWorkerThreadClient 呢?我认为在 Class View 中选择 Add->Implement Interface 会很好,但是列表中没有 IWorkerThreadClient。
我想我不太了解 ATL 或 COM,但找不到学习这个的好资源(esspessialy 最新 ATL7)。
我什至尝试过 winapi CreateThread 方法,但它不起作用。我正在传递this 类指针来运行静态方法,但是稍后会出现内存损坏。尽管如此,如果它成功了,我仍然宁愿使用 CreateThread 以外的其他东西。
现在我有类似this 的东西。在OnDocumentComplete 中有RemoveImages(sptmlDoc),我只想异步运行它。
编辑:我对@987654332@做了什么:
我尝试异步运行 RemoveImages 函数(来自here)。我在我的班级中创建了带有here 之类的签名的静态函数。 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;
}
我得到“iexplore.exe 中 0x60c0da05 处的未处理异常:0xC0000005:访问冲突读取位置 0x000001b8。”这里的粗线:
无效 CHelloWorldBHO::DontDisplayElement(CComPtr htmlElement) { CComPtr 风格; HRESULT hr = htmlElement->get_style(&style); 如果(hr == S_OK && 风格!= NULL) { 静态常量 CComBSTR strNone(L"none"); style->put_display(strNone); } }【问题讨论】:
标签: c++ multithreading com atl bho