Internet Explorer 용 애드온에서 비동기 적으로 기능을 실행하려고합니다. (VC++에서 BHO를 작성하고 있습니다). 제안 된대로 here 나는 CWorkerThread를 사용하려고합니다.CWorkerThread에서 간단한 백그라운드 스레드를 작성하는 방법
나는 몇 시간 동안 알아 내려고 노력했지만 어떻게해야할지 아직도 모른다. 나는 ATL에서 많은 경험이 없다. 좋은 문서 또는 인터넷 자습서의 부족은 나를 죽이고 있습니다.
Add-> Class로 클래스를 만들고 ATL Simple Object (ATL 프로젝트에 클래스를 추가하는 방법)를 선택합니다. 그러나이 IWorkerThreadClient를 구현하는 방법은 무엇입니까? 클래스보기에서 Add-> Implement Interface를 선택하는 것이 좋겠지 만 목록에 IWorkerThreadClient가 없다고 생각했습니다.
나는 ATL 또는 COM enaugh를 모르지만 이것을 배울 수있는 좋은 자원을 찾을 수 없다고 생각합니다. (최신 ATL7).
나는 심지어 winapi CreateThread
접근을 시도했지만 작동하지 않습니다. 정적 메서드를 실행하려면 this
클래스 포인터를 전달하지만 나중에 메모리가 손상됩니다. 그럼에도 불구하고 그것이 효과가 있었다면 나는 여전히 CreateThread
이외의 것을 사용하고 싶습니다.
지금은 this과 같은 것을 가지고 있습니다. OnDocumentComplete
에는 RemoveImages(sptmlDoc)
이 있는데 비동기식으로 실행하고 싶습니다.
편집 : 나는 CreateThread
에 무슨 짓을는 :
나는 비동기 (here에서) RemoveImages 기능을 실행했습니다. 나는 클래스 내에서 here과 같은 서명으로 정적 함수를 만들었습니다. 내가 iexplore.exe를에 0x60c0da05에서 "처리되지 않은 예외가
static DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
CHelloWorldBHO* myClass = (CHelloWorldBHO*)lpParam;
myClass->RemoveImages(myClass->m_tmpHtmlDocument2);
return 0;
}
:
if (htmlDoc2 != NULL)
{
m_tmpHtmlDocument2 = htmlDoc2;
m_hThread = CreateThread(NULL, 0, MyThreadFunction, this, 0, &m_threadId);
}
및 MyThreadFunction
: RemoveImages이 매개 변수 그래서이 클래스의 멤버에 복사했다가 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"); style->put_display(strNone); } }
당신이 [이 사람] (http://www.codeproject.com/KB/threads/CWorkerThread 같은 예제를 살펴나요이 .aspx)? –
예. 나는 이것과 [this] (http://msdn.microsoft.com/en-us/library/w849dybf.aspx)가이 클래스에 관한 "좋은"소스 일 뿐이라고 생각한다. 하지만 문제가 있습니다. 나는 "오류 C2504 : 'IWorkerThreadClient': 기본 클래스가 정의되지 않았기 때문에'IWorkerThreadClient'를 구현하는 간단한 클래스를 생성 할 수없고'#include'을 추가하고 있습니다. 나는 add-> class-> Atl Simple Object에 의해 생성 된 객체에서만 그것을 구현할 수있다. 나는'IWorkerThreadClient' 인터페이스에 대한 포인터를'AddHandle'에 전달할 수없는 이유 때문에 나중에 사용하지 않습니다. –