大家好:我在写一个ActiveX控件,希望使用Flash做界面,为了让Flash和我的控件更好地结合,
我并没有创建一个窗口专门绘制Flash,而是创建了一个无窗口的Flash(IOleInPlaceObjectWindowless),
并且使用Flash的IViewObject接口,用OleDraw方法,绘制Flash的内容到一个HDC上面:
OleDraw(flashView, DVASPECT_TRANSPARENT, hDC, &rc);在VC的控件测试程序中(ActiveX Control Test Container) ,一切表现正常,Flash的内容被正确地绘制到了我指定的HDC上,
但在IE上使用时,用OleDraw绘制结果都是白色,看上去好像什么也没有绘制,我把OleDraw绘制结果保存到了一个BMP文件中,也是白色。我又测试了MiniIE和遨游浏览器,他们都表现正常。
而且我google搜索也看到有人问类似的问题,所以我估计应该不是我绘制代码的错误,而是IE的一些安全性限制。总结起来,我的猜测是:一个ActiveX创建并使用另一个ActiveX时,IE会阻止他们之间的交互。
具体到我的例子就是:我的ActiveX创建一个无窗口的Flash,IE会阻止他们的交互导致OleDraw绘制失败。我的猜测对么?还是有别的原因?
如果真是IE做了什么限制,我有什么解决方法??诚请高手赐教,非常感谢!!

解决方案 »

  1.   

    如果是IE阻止,可以简单的测试一下,IE设置中 降低IE的安全级别等,看能否工作,..
      

  2.   

    感谢oyljerry迅速的回复,我在IE设置中降低了安全等级,但问题仍然存在。我假设是:IE的安全限制主要针对我的ActiveX,但我的问题表现出“IE还干涉了我的ActiveX和别的ActiveX之间的通信”。
      

  3.   

    可不可以简单的把Flash控件直接打到你的控件当中去 对IE看来就跟一个ActiveX一样? 不知道可行否?
      

  4.   

    to Tinary3v0,你说的我也想过。如果打包到我的控件内部,当我要使用Flash的功能时,还是需要调用CoCreateInstance,创建出Flash的实例,
    虽然我没有尝试,但我猜测,这样做从原理上应该和不打包没什么区别,
    也许我对你说的打包理解不正确,
    但更重要的是Flash10a.ocx本身3.7M,我的控件本身也不到1M,打进去有点不太划算。
      

  5.   

    如果VS调试器不行,那就用windbg,你遇到的这些问题,基本只有靠自己调试。
      

  6.   

    to: sgzwiz,谢谢你的建议,我正做一些简化的例子,察看每个接口的返回值,重点暴露问题
    to: sys0008:
    IE版本: 6.0.2900
    系统版本: winxp sp2
    版本都比较低,测试没有通过,尚未测试IE高版本。MiniIE版本:1.6
    遨游浏览器版本:2.5
    这两个浏览器都没问题
      

  7.   

    大哥,为什么我把HDC保存为bmp图像格式时,怎么是黑色的。参照代码是:http://www.codeguru.com/cpp/g-m/multimedia/graphics/article.php/c12229/Transparent-Flash-Control-in-Plain-C.htm。保存代码如下所示:(由于我的机器设置是32位深度的,所以调色板的信息为0)这里面有什么问题嘛?
    BOOL bRet = UpdateLayeredWindow(hwnd, NULL, &p, &sz, m_hdcBack, &p2, 0, &bf, m_iBPP == 32 ? ULW_ALPHA : ULW_OPAQUE);

    //*zhiqiang++
    static int i = 0;
    for(;i<10;++i)
    {
    std::wstring  strFileName;
    CTime   m_CurDT;
    m_CurDT=CTime::GetCurrentTime();
    strFileName = string_helper::string_format(L"./%d-%d-%d-%d.bmp",m_CurDT.GetYear(),m_CurDT.GetMonth(),m_CurDT.GetDay(), i); SaveBitmapToFile(m_hdcBack, CopyScreenToBitmap(m_hdcBack, &rTotal), strFileName.c_str());
    }OLECONTAINER(HBITMAP)::CopyScreenToBitmap(HDC hdcBack, LPRECT  lpRect)    
    {    
    HDC   hMemDC;    
    HBITMAP   hBitmap,hOldBitmap;    
    int   nX,   nY,   nX2,   nY2;    
    int   nWidth,   nHeight;    
    int   xScrn,   yScrn;     if   (IsRectEmpty(lpRect))    
    return   NULL;    
    // hScrDC   =   CreateDC("DISPLAY",   NULL,   NULL,   NULL);    
    hMemDC   =   CreateCompatibleDC(hdcBack);     nX   =   lpRect->left;    
    nY   =   lpRect->top;    
    nX2   =   lpRect->right;    
    nY2   =   lpRect->bottom;     xScrn   =   GetDeviceCaps(hdcBack,   HORZRES);    
    yScrn   =   GetDeviceCaps(hdcBack,   VERTRES);     if   (nX   <   0)    
    nX   =   0;    
    if   (nY   <   0)    
    nY   =   0;    
    if   (nX2   >   xScrn)    
    nX2   =   xScrn;    
    if   (nY2   >   yScrn)    
    nY2   =   yScrn;    
    nWidth   =   nX2   -   nX;    
    nHeight   =   nY2   -   nY;    
    hBitmap=CreateCompatibleBitmap(hdcBack,nWidth,nHeight);    
    hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);    
    BitBlt(hMemDC,0,0,   nWidth,nHeight,hdcBack,   nX,   nY,   SRCCOPY);     hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);     //DeleteDC(hMemDC);     return   hBitmap;    
    }    OLECONTAINER(BOOL)::SaveBitmapToFile(HDC hdcBack, HBITMAP hBitmap,  LPCTSTR lpFileName)    
    {    
    // HDC   hDC;    
    // CDC   dc;    
    int   iBits;   //   Bits   per   pixel   in   current   resolution    
    WORD   wBitCount;   //   Bits   per   pixel   in   bitmap    
    DWORD   dwPaletteSize   =   0,   dwBmBitsSize,   dwDIBSize,   dwWritten;    
    BITMAP   Bitmap;    
    BITMAPFILEHEADER   bmfHdr;    
    BITMAPINFOHEADER   bi;    
    LPBITMAPINFOHEADER   lpbi;    
    HANDLE   fh,   hDib,   hPal;    
    HPALETTE   hOldPal   =   NULL;     //   Compute   use   bits   per   pixel   of   bitmap    
    // dc.CreateDC("DISPLAY",   NULL,   NULL,   NULL);    
    iBits   =   GetDeviceCaps(hdcBack,   BITSPIXEL)   *   GetDeviceCaps(hdcBack,   PLANES);    
    // DeleteDC(dc);     if   (iBits   <=   1)    
    wBitCount   =   1;    
    else   if   (iBits   <=   4)    
    wBitCount   =   4;    
    else   if   (iBits   <=   8)    
    wBitCount   =   8;    
    else   if   (iBits   <=   24)    
    wBitCount   =   24;    
    else   if   (iBits   <=   32)    
    wBitCount   =   32;     //   Compute   palette   size    
    if   (wBitCount   <=   8)    
    dwPaletteSize=(1<<wBitCount);    
    //   Set   bitmap   header    
    GetObject(hBitmap,   sizeof(BITMAP),   (LPSTR)&Bitmap);    
    bi.biSize   =   sizeof(BITMAPINFOHEADER);    
    bi.biWidth   =   Bitmap.bmWidth;    
    bi.biHeight   =   -Bitmap.bmHeight;    
    bi.biPlanes   =   1;    
    bi.biBitCount   =   wBitCount;    
    bi.biCompression   =   BI_RGB;    
    bi.biSizeImage   =   0;    
    bi.biXPelsPerMeter   =   0;    
    bi.biYPelsPerMeter   =   0;    
    bi.biClrUsed   =   0;    
    bi.biClrImportant   =   0;     dwBmBitsSize   =   ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;    //   Allocate   memory   for   bitmap    
    hDib   =   GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));    
    lpbi   =   (LPBITMAPINFOHEADER)GlobalLock(hDib);    
    *lpbi   =   bi;     /*zhiqiang--
    //   Process   palette    
    hPal   =   GetStockObject(DEFAULT_PALETTE);    
    if   (hPal)    
    {    
    //## hdcBack   =   ::GetDC(NULL);    
    hOldPal   =   SelectPalette(hdcBack,(HPALETTE)hPal,FALSE);    
    RealizePalette(hdcBack);    
    }  
    //*/ //   Gain   pixel   value   in   new   palette    
    GetDIBits(hdcBack,hBitmap,(UINT)(Bitmap.bmHeight), 0,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize,   (BITMAPINFO   *)lpbi,DIB_RGB_COLORS);     /*zhiqiang--
    //   Restore   palette    
    if   (hOldPal)    
    {    
    SelectPalette(hdcBack,   hOldPal,   TRUE);    
    RealizePalette(hdcBack);    
    ::ReleaseDC(NULL,   hdcBack);    

    //*/ //   Create   bitmap   file    
    fh   =   CreateFile(lpFileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL   |   FILE_FLAG_SEQUENTIAL_SCAN,   NULL);    
    if   (fh==INVALID_HANDLE_VALUE)    
    return   FALSE;     //   Set   bitmap   file   header    
    bmfHdr.bfType   =   0x4D42;   //   "BM"    
    dwDIBSize=sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;    
    bmfHdr.bfSize   =   dwDIBSize+sizeof(BITMAPFILEHEADER);    
    bmfHdr.bfReserved1   =   0;    
    bmfHdr.bfReserved2   =   0;    
    bmfHdr.bfOffBits   =   (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;     //   Write   bitmap   file   header    
    WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);     //   Write   bitmap   body    
    WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,    
    &dwWritten,   NULL);     //   Memory   release    
    GlobalUnlock(hDib);    
    GlobalFree(hDib);    
    CloseHandle(fh);    
    return   TRUE;    
    }