我用vb6做了一个dll,目的是把一个文件的内容(已打包图片、文字等)转换成gif图片,在网页上显示出来。
在网上搜到的bytes转picture程序,如下:
Private Function PictureFromByteStream(B() As Byte) As IPicture
    Dim LowerBound As Long
    Dim ByteCount  As Long
    Dim hMem  As Long
    Dim lpMem  As Long
    Dim IID_IPicture(15)
    Dim istm As stdole.IUnknown    On Error GoTo Err_Init
    If UBound(B) < 0 Then Exit Function
    
    LowerBound = LBound(B)
    ByteCount = (UBound(B) - LowerBound) + 1
    hMem = GlobalAlloc(&H2, ByteCount)
    If hMem <> 0 Then
        lpMem = GlobalLock(hMem)
        If lpMem <> 0 Then
            CopyMemory ByVal lpMem, B(LowerBound), ByteCount
            Call GlobalUnlock(hMem)
            If CreateStreamOnHGlobal(hMem, 1, istm) = 0 Then
                If CLSIDFromString(StrPtr("{7BF80980-BF32-101A-8BBB-00AA00300CAB}"), IID_IPicture(0)) = 0 Then
                  Call OleLoadPicture(ByVal ObjPtr(istm), ByteCount, 0, IID_IPicture(0), PictureFromByteStream)
                End If
            End If
        End If
    End If
    Exit Function
    
Err_Init:
    Set PictureFromByteStream = Nothing
End Function
上面的API函数调用了ole32和olepro 。
然后使用paintpicture 贴到picturebox里(autoredraw=true)。本机调试都能正常运行,但是放到服务器上,文字、画线都正常,就是这个贴上去的图像不显示(空白),也没有任何错误提示,日志里也没看到,服务器系统是win2008企业版,IIS7 。使用另外单独编写的程序在服务器上调用此dll,图片也是正常的。
还有,不用上面的程序,直接二进制字节存盘、再加载成图片,现象也完全一样。高手给分析一下,这个问题我感觉是IIS7对上面的哪个部分有限制,。
几天了,不得其解。

解决方案 »

  1.   

    查到这样一段文字:
    VB ActiveX DLL中的PaintPicture在单线程模式下与多线程模式下的表现差异
     同样是VB ActiveX DLL中的PaintPicture,在单线程模式下,会绘制在对象的Image的hDC上,而在多线程模式下,则绘制在对象的实际hDC上,这样就会造成直接调用windows GDI函数的绘制结果与PaintPicture的绘制结果无法叠加。Form和PicturBox、UserControl对象,具有hDC属性,而这个属性是与AutoRedraw属性相关的。但PaintPicture所选择的hDC,则与AutoRedraw属性无关。难道是paintpicture的问题?
      

  2.   

    现在比较明显了,问题出在Paintpicture上,在组件里,它都画不出图,而用“set picture=图片”却可以,还得想点其他办法。