C ++检查网络浏览器是否关闭

时间:2018-07-05 13:29:16

标签: c++ winapi exception codeblocks

#include <windows.h>
#include <exdisp.h>

class CWebBrowser{

    public:
        HRESULT hr;
        IWebBrowserApp *www;

    HRESULT init(){
        CLSID clsid;
        const IID IID_IEApplication = {0x0002DF05,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};

        if(www) hr = www->put_Visible(-1);
        if(hr!=0 || www==NULL){
            QuitBrowser();
            hr=CLSIDFromProgID(L"InternetExplorer.Application",&clsid);
            if(hr==0) hr=CoCreateInstance(clsid,NULL,CLSCTX_ALL,IID_IEApplication,reinterpret_cast<void**>(&www));
            if(hr==0) hr = www->put_Visible(-1);
        }
    return hr;
   }

    HRESULT browse(BSTR addr){
        VARIANT vEmpty;
        VariantInit(&vEmpty);

        hr=www->Navigate(addr, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
        VariantClear(&vEmpty);

    return hr;
    }

    void QuitBrowser(){
        if(www){
            www->Quit();
            www->Release();
            www=NULL;
        }
    }

    CWebBrowser(){
        hr=CoInitialize(NULL);
    }

    ~CWebBrowser(){
        if(www){
            www->Quit();
            www->Release();
            www=NULL;
        }
        CoUninitialize();
    }
};

我正在调用init()函数,以检查Web浏览器是否在打开另一个网页之前仍处于打开状态。

当我第一次运行该应用程序时,任务管理器(iexplorer.exe)和(iexplorer.exe * 32)中显示2个进程

当我关闭应用程序时,有时进程会关闭,有时却不会。

有时(iexplorer.exe * 32)关闭,只有(iexplorer.exe)打开。在这种情况下,当我尝试调用init()时,应用程序将崩溃。

使用CodeBlocks 17.12,Windows 2000和IE 11。

1 个答案:

答案 0 :(得分:0)

这对我来说很好。也许您正在过早致电 <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="300dp" android:fitsSystemWindows="true"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:fitsSystemWindows="true" app:collapsedTitleGravity="center_horizontal" app:contentScrim="@color/main_orange" app:expandedTitleMarginBottom="75dp" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="10dp" app:expandedTitleTextAppearance="@style/CollapsibleToolbarTitleTextAppearanceExpanded" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_margin="5dp" android:orientation="vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/ic_image_area_black_48dp" android:tint="@color/white_50" /> <TextView android:id="@+id/failedToLoadImageText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="10dp" android:gravity="center" android:shadowColor="@color/black" android:shadowRadius="3" android:text="Please connect to the internet to view the photo" android:textColor="@color/white_50" /> </LinearLayout> <android.support.v4.view.ViewPager android:id="@+id/galleryViewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> <ImageView android:layout_width="match_parent" android:layout_height="150dp" android:layout_alignParentBottom="true" android:layout_centerVertical="true" android:background="@drawable/black_gradient" android:fitsSystemWindows="true" android:scaleType="centerCrop" app:layout_collapseMode="parallax" /> </RelativeLayout> <TextView android:id="@+id/subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginBottom="30dp" android:layout_marginEnd="10dp" android:layout_marginStart="10dp" android:maxLines="2" android:text="Lorem Ipsum Iran Lorem Ipsum Iran Lorem Ipsum Iran Lorem Ipsum Iran Lorem Ipsum Iran Lorem Ipsum Iran Lorem Ipsum Iran Lorem Ipsum Iran " android:textColor="@android:color/white" android:textSize="16sp" app:layout_collapseMode="parallax" /> <com.rd.PageIndicatorView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center|bottom" android:layout_marginBottom="10dp" app:layout_collapseMode="parallax" app:piv_radius="5dp" app:piv_selectedColor="@color/main_orange" app:piv_unselectedColor="@color/dim_gray_50" app:piv_viewPager="@id/galleryViewPager" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:contentInsetEnd="0dp" app:contentInsetLeft="0dp" app:contentInsetRight="0dp" app:contentInsetStart="0dp" app:contentInsetStartWithNavigation="0dp" app:layout_collapseMode="pin" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> </android.support.v7.widget.Toolbar> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout>

这是我的MCVE

www->Release()

如果在调用#include <Windows.h> #include <assert.h> #include <Exdisp.h> #include <iostream> #pragma comment (lib, "SHDOCVW.lib") IWebBrowserApp *www; HRESULT init() { CLSID clsid; const IID IID_IEApplication = {0x0002DF05,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}; HRESULT hr = CLSIDFromProgID (L"InternetExplorer.Application", &clsid); if (hr) { std::cout << std::hex << "CLSIDFromProgID failed, error " << hr << "\n"; return hr; } hr = CoCreateInstance (clsid, NULL, CLSCTX_ALL, IID_IEApplication, reinterpret_cast<void**>(&www)); if (hr) { std::cout << std::hex << "CoCreateInstance failed, error " << hr << "\n"; return hr; } hr = www->put_Visible(-1); if (hr) { std::cout << std::hex << "put_Visible failed, error " << hr << "\n"; www->Release (); www = nullptr; return hr; } return S_OK; } HRESULT browse(BSTR addr) { HRESULT hr; if (www) { VARIANT vEmpty; VariantInit (&vEmpty); hr = www->Navigate (addr, &vEmpty, &vEmpty, &vEmpty, &vEmpty); VariantClear (&vEmpty); } return hr; } int main () { HRESULT hr = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED); assert (hr == 0); int mb_result; while (1) { hr = init (); if (hr == 0) { mb_result = MessageBoxW (NULL, L"About to browse", L"Browser Test", MB_OKCANCEL); if (mb_result == IDOK) { BSTR url = SysAllocString (L"https://www.google.com"); hr = browse (url); SysFreeString (url); if (hr) std::cout << "browse () returned: " << std::hex << hr << "\n"; } mb_result = MessageBoxW (NULL, L"About to quit", L"Browser Test", MB_OKCANCEL); if (mb_result == IDOK) www->Quit (); www->Release (); www = nullptr; } mb_result = MessageBoxW (NULL, L"Again?", L"Browser Test", MB_YESNO); if (mb_result == IDNO) break; } CoUninitialize (); } init之间关闭浏览器(在我的情况下为Edge,在Windows 10上运行),我得到:

browse

这是完全可以理解的,因为此错误表示“ RPC服务器不可用”。它当然不会崩溃。


修改

愚蠢的Vista错误,请参阅OP的最新注释。调用browse () returned: 800706ba 之后,如果至少您太快了,则下一次对www->Quit()的调用将失败。

所以,有两个建议。

1(可能会工作):

CoCreateInstance()

2(更加激烈,为简洁起见,省略了错误处理):

for (int i = 0; i < 10; ++i)
{
    hr = CoCreateInstance (clsid, NULL, CLSCTX_ALL, IID_IEApplication, reinterpret_cast<void**>(&www));
    if (hr != ERROR_SHUTDOWN_IS_SCHEDULED)    // not really
        break;
    Sleep (1000);
}

想尝试一下,OP,然后报告吗?

相关问题