本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177

因为界面元素很少,所以界面开发很简单。现在讲业务逻辑。

整个逻辑分为下载逻辑和安装逻辑,还有UI逻辑。下载逻辑很麻烦。为什么呢?因为我没有自己的服务器。幸好有百度网盘,可以有共享外链。所以我要先将镜像文件放到百度网盘上,然后分享。在软件里面嵌入一个webbrowser,下载的时候先打开那个百度共享地址,然后在这个页面点击下载链接(直接下载这个地址会失败),最后获取一个下载地址,这个地址才是真正的下载地址。麻烦啊。如果有一个服务器可以直接下载文件多好啊。

问题来了,mfc里有webbrowser控件,但我使用的256版duilib没有。不过在网上找到一个,改来改去,好不容易可用了。又碰到了弹出javascript错误框的问题。前天才知道,原来duilib一直在更新,现在已经有webbrowser控件了。吐血啊... 既然duilib已经有这个控件了,我就不说了,直接贴解决如何消除javascript错误框和获取下载地址的代码

STDMETHODIMP CWebBrowserBase::Exec( const GUID* pguidCmdGroup, DWORD nCmdID,
                              DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut )
{

HRESULT hr = S_OK;

if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler))
    {

switch (nCmdID)
        {

case OLECMDID_SHOWSCRIPTERROR:
            {
                IHTMLDocument2*             pDoc = NULL;
                IHTMLWindow2*               pWindow = NULL;
                IHTMLEventObj*              pEventObj = NULL;
                BSTR                        rgwszNames[5] =
                {
                    SysAllocString(L"errorLine"),
                    SysAllocString(L"errorCharacter"),
                    SysAllocString(L"errorCode"),
                    SysAllocString(L"errorMessage"),
                    SysAllocString(L"errorUrl")
                };
                DISPID                      rgDispIDs[5];
                VARIANT                     rgvaEventInfo[5];
                DISPPARAMS                  params;
                BOOL                        fContinueRunningScripts = true;
                int                            i;

params.cArgs = 0;
                params.cNamedArgs = 0;

// Get the document that is currently being viewed.
                hr = pvaIn->punkVal->QueryInterface(IID_IHTMLDocument2, (void **) &pDoc);                
                // Get document.parentWindow.
                hr = pDoc->get_parentWindow(&pWindow);
                pDoc->Release();
                // Get the window.event object.
                hr = pWindow->get_event(&pEventObj);
                // Get the error info from the window.event object.
                for (i = 0; i < 5; i++)
                {  
                    // Get the property's dispID.
                    hr = pEventObj->GetIDsOfNames(IID_NULL, &rgwszNames[i], 1,
                        LOCALE_SYSTEM_DEFAULT, &rgDispIDs[i]);
                    // Get the value of the property.
                    hr = pEventObj->Invoke(rgDispIDs[i], IID_NULL,
                        LOCALE_SYSTEM_DEFAULT,
                        DISPATCH_PROPERTYGET, &params, &rgvaEventInfo[i],
                        NULL, NULL);
                    SysFreeString(rgwszNames[i]);
                }

// At this point, you would normally alert the user with
                // the information about the error, which is now contained
                // in rgvaEventInfo[]. Or, you could just exit silently.

(*pvaOut).vt = VT_BOOL;
                if (fContinueRunningScripts)
                {
                    // Continue running scripts on the page.
                    (*pvaOut).boolVal = VARIANT_TRUE;
                }
                else
                {
                    // Stop running scripts on the page.
                    (*pvaOut).boolVal = VARIANT_FALSE;            
                }
                hr = S_OK;
                break;
            }
        default:
            hr = OLECMDERR_E_NOTSUPPORTED;
            break;
        }
    }
    else
    {
        hr = OLECMDERR_E_UNKNOWNGROUP;
    }
    return (hr);
}

HRESULT STDMETHODCALLTYPE CWebBrowserBase::Download(IMoniker *pmk,
                        IBindCtx *pbc,
                        DWORD dwBindVerb,
                        LONG grfBINDF,
                        BINDINFO *pBindInfo,
                        LPCOLESTR pszHeaders,
                        LPCOLESTR pszRedir,
                        UINT uiCP)
{
    HRESULT hr = S_FALSE;
    LPOLESTR sURL = NULL;
    if(pmk)
        hr = pmk->GetDisplayName(pbc, NULL, &sURL);

static CString s_url;
    CString tmp = sURL;
    if (s_url != tmp)
    {
        g_status = EAZ_DOWNLOAD;
        s_url = tmp;
    }

//When working with sURL, use CComBSTR strUrl(sURL)
    //Otherwise, you may end up with a huge mem leak?

//Free string as stated in MSDN
    //Get IMalloc interface
    IMalloc *pMalloc;
    if(CoGetMalloc((DWORD)1, &pMalloc) == S_OK)
    {
        pMalloc->Free((LPVOID)sURL);
    }
    else
        CoTaskMemFree((LPVOID)sURL);

return S_OK;
}

小妞会装机 -- 一个装机软件的开发笔记(五)相关推荐

  1. 树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  2. JNI开发笔记(五)--JNI语法总结

    JNI语法总结 引 前言 1. 传参类型为变量/变量指针 1.1 变量 1.2 变量指针 2. 传参类型为数组指针 3. 传参类型为结构体指针 引 JNI开发笔记(一)–Android Studio安 ...

  3. 小妞会装机 -- 一个装机软件的开发笔记( 三)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 界面基本山确定下来,感觉操作起来的确很简单, ...

  4. 小妞会装机 -- 一个装机软件的开发笔记 (一)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 见很多人不会装系统,拿了ghost盘也还是不 ...

  5. 小妞会装机 -- 一个装机软件的开发笔记 (二)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 要做一个操作非常简单的装机软件.简单到什么程 ...

  6. 小妞会装机 -- 一个装机软件的开发笔记(七)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 用libcurl解决了下载的问题,用duil ...

  7. 小妞会装机 -- 一个装机软件的开发笔记(八)

    做好了这个软件后,我很高兴,因为我以前没有用过dui,而通过做这个软件学习并使用了dui技术,尽管这个软件只有一些非常简单的界面元素.dui让我以后的软件开发多了一个选择.通过这个软件的实践,我觉得不 ...

  8. 小妞会装机 -- 一个装机软件的开发笔记( 四)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 界面的xml配好后,就开始写实现代码.先上代 ...

  9. 小妞会装机 -- 一个装机软件的开发笔记(六)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 下载地址获得了,那就下载吧.最简单的,URL ...

最新文章

  1. perfect book
  2. python3环境下“No module named nibabel”的解决办法
  3. python中forward函数的引用_调用没有.forward()的forward函数
  4. 的注册表怎么才能删干净_白蚁怎么才能消灭干净?
  5. Nginx概述与安装
  6. 【译】A look at MobileIron’s zero sign-on and passwordless authentication plans
  7. docker中创建Jmeter及在外部使用JMeter-Server控制
  8. 【文末有赠书】从历史角度讲现代数学
  9. 用Python手写五大经典排序算法,看完这篇终于懂了!
  10. Linux常用命令及笔记
  11. vue 指令 v-model
  12. Redis在windows下安装说明
  13. hdu 2184 01背包变形
  14. 云开发初探 —— 更简便的小程序开发模式
  15. 网络工程师Day3--PPPoE配置实验
  16. 计算机专业Java必读书单,高清PDF电子版下载
  17. C语言函数 bzero
  18. matlab开关电源仿真软件,开关电源仿真设计软件选择
  19. loadrunner-md5签名加密并转大写
  20. MapWinGIS4.9.3的二次开发

热门文章

  1. 每天都在反省自己,但是每天却都浑浑噩噩
  2. 商城项目实战31:solar服务器搭建、搜索功能实现
  3. 软件测试基础【一篇足矣】
  4. window11中QQ登录“无法访问个人文件夹”解决方案
  5. m1虚拟机运行Linux,虚拟机Parallels发布新技术预览版,M1 Mac能运行Win 10了
  6. 文华财经期货多空趋势指标公式,期货幅图高抛低吸逃顶抄底精准买卖点信号系统
  7. 可行性研究报告——学生成绩查询系统
  8. UML学生成绩管理系统
  9. ANSYS使用APDL数组存储每一个荷载子步下的后处理参数值
  10. 怎么用python编程分段函数值域_如何在Python中用多变量定义分段函数