zhufeng2007 2017-06-28 03:43 采纳率: 0%
浏览 987

如何使用MSHTML解析HTML 并生成图片?

想用mshtml解析html字符串并生成图片,并且程序不要有窗口。
代码如下:

 IHTMLDocument2 *pDoc = NULL;  
    CoInitialize(NULL);  
    CoCreateInstance(CLSID_HTMLDocument,  
        NULL,  
        CLSCTX_INPROC_SERVER,  
        IID_IHTMLDocument2,  
        (LPVOID *) &pDoc);  
    if (pDoc)  
    {  
        IHTMLElement       *pElement = (IHTMLElement *) NULL;
        IHTMLElementRender *pRender = (IHTMLElementRender *) NULL;
        BSTR bstr = SysAllocString(OLESTR("<HTML><body style='width:200px;height:300px;'>fffffffffffffffffffffffffffff</body></HTML>"));
        SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);

        VARIANT *param;
        HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
        param->vt = VT_BSTR;
        param->bstrVal = bstr;
        hr = SafeArrayUnaccessData(psaStrings);
        hr = pDoc->write(psaStrings);
        pDoc->close();
        pDoc->get_body(&pElement);

        //  Let's be paranoid...
        if (pElement == (IHTMLElement *) NULL)
            return FALSE;

        pElement->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);

        if (pRender == (IHTMLElementRender *) NULL)
            return FALSE;

        long width = 200;  
        long height = 150;

        HDC src = GetDC(NULL);  
        //HDC src = ::GetDC(hwnd);
        HDC dc = CreateCompatibleDC(src);  
        HBITMAP hbitmap = CreateCompatibleBitmap(src, width, height);  
        HBITMAP hOriginal = (HBITMAP)SelectObject(dc, hbitmap);  
        pRender->DrawToDC(dc);  
        SelectObject(dc, hOriginal);  


        DeleteDC(dc);  
        DeleteDC(src);  
        pRender->Release();

        //ScreenSnap(hbitmap,L"d:\\a.bmp",src);

        //pDoc->Release();  
        //return hbitmap;
    }  
    CoUninitialize();

生成图片代码:

void ScreenSnap(HBITMAP hBitmap,LPCWSTR bmpPath,HDC dc)  
{  
    BITMAP bmInfo;  
    DWORD bmDataSize;  
    char *bmData;//位图数据  
    GetObject(hBitmap,sizeof(BITMAP),&bmInfo);//根据位图句柄,获取位图信息  
    bmDataSize=bmInfo.bmWidthBytes*bmInfo.bmHeight;//计算位图数据大小  
    bmData=new char[bmDataSize];//分配数据  
    BITMAPFILEHEADER bfh;//位图文件头  
    bfh.bfType=0x4d42;  
    bfh.bfSize=bmDataSize+54;  
    bfh.bfReserved1=0;  
    bfh.bfReserved2=0;  
    bfh.bfOffBits=54;  
    BITMAPINFOHEADER bih;//位图信息头  
    bih.biSize=40;  
    bih.biWidth=bmInfo.bmWidth;  
    bih.biHeight=bmInfo.bmHeight;  
    bih.biPlanes=1;  
    bih.biBitCount=24;  
    bih.biCompression=BI_RGB;  
    bih.biSizeImage=bmDataSize;  
    bih.biXPelsPerMeter=0;  
    bih.biYPelsPerMeter=0;  
    bih.biClrUsed=0;  
    bih.biClrImportant=0;  

    ::GetDIBits(dc,hBitmap,0,bmInfo.bmHeight,bmData,(BITMAPINFO *)&bih,DIB_RGB_COLORS);//获取位图数据部分 

    HANDLE hFile=CreateFile(bmpPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,  
        FILE_ATTRIBUTE_NORMAL,0);//创建文件  
    DWORD dwSize;  

    WriteFile(hFile,(void *)&bfh,sizeof(BITMAPFILEHEADER),&dwSize,0);//写入位图文件头  
    WriteFile(hFile,(void *)&bih,sizeof(BITMAPINFOHEADER),&dwSize,0);//写入位图信息头  

    WriteFile(hFile,(void *)bmData,bmDataSize,&dwSize,0);//写入位图数据  
    ::CloseHandle(hFile);//关闭文件句柄  
} 

生成的是一张黑色的图片,没有任何内容。

  • 写回答

1条回答 默认 最新

  • devmiao 2017-06-28 16:48
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试