如何在线程等待

时间:2016-04-08 21:27:32

标签: c++ internet-explorer com

我正在编写一个应用程序来打开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继续执行此操作,但阻止应用程序关闭。

0 个答案:

没有答案