我正在编写一个应用程序来打开Internet Explorer并使用COM来控制它。下面是一个简化的"浏览器"我上过课。
class Browser {
public:
Browser() {
if (FAILED(OleInitialize(NULL))) {
throw 1;
}
}
~Browser() {
OleUninitialize();
}
void open(const wchar_t* url) {
HRESULT hr;
hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
IID_IWebBrowser2, (void**)&_pWebBrowser);
if (FAILED(hr) || _pWebBrowser == NULL) { throw 1; }
VARIANT vEmpty;
VariantInit(&vEmpty);
BSTR bstrUrl = SysAllocString(url);
hr = _pWebBrowser->Navigate(bstrUrl, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
if (FAILED(hr)) { throw 1; }
_pWebBrowser->put_Visible(VARIANT_TRUE);
SysFreeString(bstrUrl);
//TODO: hook event listener
}
private:
CComQIPtr<IWebBrowser2> _pWebBrowser;
CComQIPtr<IConnectionPoint> _pConnectionPoint;
DWORD _adviseCookie;
};
这个想法是通过IConnectionPointContainer挂钩事件监听器并在事件发生时处理它们。但是,在打开函数完成后,应用程序关闭,我不再能够继续控制IE。
我尝试使用wait functions,如此:
int main(){
HANDLE hEvent = ::CreateEvent( /*...*/ );
Browser* b = new Browser();
b->open(_T("http://stackoverflow.com"));
::WaitForSingleObject(hEvent, INFINITE);
}
但是当我这样做时,浏览器不会继续导航,也不会触发事件。
我也尝试了一个带有和没有睡眠间隔的while循环,如下所示:
int main(){
Browser* b = new Browser();
b->open(_T("http://stackoverflow.com"));
while(true){
Sleep(1000); //Both with and without this sleep
}
}
Internet Explorer仍然无法继续执行。
问题:
正确的方法是让线程休眠以允许IE继续执行此操作,但阻止应用程序关闭。