1. 程式人生 > >MFC與Webbrowser交互(通過JS)

MFC與Webbrowser交互(通過JS)

omv .cn amp c++ ocs scrip spa script files

最近修改老舊的MFC項目,用的網頁做界面,和HTML交互采用的是COM方式,繁瑣,醜陋又性能低,於是考慮利用js來進行界面交互,查了一天的資料,現在整理如下,供後來需要的人參考,雖然大概幾乎不會有人用MFC來做項目了(笑),用winform或者WPF或者網頁做界面,高性能部分用C++封裝的dll也許是更好的選擇,當然直接在exe裏面提供http訪問接口是最吼的(go語言賽高)!界面這個是比較大的話題,可以開個專題慢慢說了。。。

核心的一個CWebPage類是一個老外寫的,封裝了一些com操作,用來和webbrowser進行js調用,但是只能調用已經存在的js代碼,有時需要自己向網頁註入一些js函數(你懂的),你可以在一個空白頁上面,用js生成整個頁面。

    IHTMLDocument2* pHTMLDoc = (IHTMLDocument2*)web.get_Document();  
    if(pHTMLDoc != NULL)
    {
        IHTMLWindow2* pHTMLWnd;
        pHTMLDoc->get_parentWindow( &pHTMLWnd );
        if (pHTMLWnd != NULL)
        {
            CString js_code;
            js_code="function test(str){ alert(str);return str;}
";//此次為實際寫入的javascript代碼 //js_code.Format(L"goToLocation(‘%s‘);",JScode);//JS函數名+參數 VARIANT ret; pHTMLWnd->execScript(js_code.AllocSysString(), L"Javascript", &ret);//執行javascript代碼 pHTMLWnd->Release(); CWebPage page; page.SetDocument(web.get_Document()); CComVariant varResult; page.CallJScript(
"test","123",&varResult); MessageBox(CString(varResult.bstrVal)); } pHTMLDoc->Release(); }

先向網頁註入(這樣聽上去比較高大上)一個js函數(代碼只是方法之一,還有其他的方法就不列舉了),然後通過webpage封裝的方法調用函數並返回值,這樣做的會比C++用COM接口操作網頁簡單而且速度更快(並沒有測試,理論上應該是這樣)

這裏只是解決MFC調用js,js調用MFC比較復雜也就沒有去深入,COM這種東西感覺真的是上古遺物了,項目裏使用的是截獲網頁的跳轉地址來判斷需要進行的操作,基本上已經足夠了,記得winform裏的webbrowser和js互相調用是將對象封裝成一個com對象暴露給webbrowser。

源碼:下載

MFC與Webbrowser交互(通過JS)