VB 用户控件有关问题

VB 用户控件问题
本帖最后由 chenai613 于 2014-11-17 18:19:09 编辑
自己做了个用户控件,在运行和调用时是没有问题的,但生成EXE时,提示运行时错误 '6'  溢出。
以下是模块代码

Option Explicit

Private Type GUID
    Data1     As Long
    Data2     As Long
    Data3     As Long
    Data4(7) As Byte
End Type
Private Type PICTDESC
    size      As Long
    Type      As Long
    hBmp      As Long
    hPal      As Long
    Reserved As Long
End Type
Private Type GdiplusStartupInput
     GdiplusVersion            As Long
     DebugEventCallback        As Long
     SuppressBackgroundThread As Long
     SuppressExternalCodecs    As Long
End Type
Private Type PWMFRect16
     left    As Long
     top     As Long
     Right   As Long
     Bottom As Long
End Type
Private Type wmfPlaceableFileHeader
     Key          As Long
     hMf          As Long
     BoundingBox As PWMFRect16
     Inch         As Long
     Reserved     As Long
     CheckSum     As Long
End Type

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PICTDESC, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
Private Declare Function PatBlt Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function GdipLoadImageFromFile Lib "gdiplus.dll" (ByVal FileName As Long, GpImage As Long) As Long
Private Declare Function GdiplusStartup Lib "gdiplus.dll" (Token As Long, gdipInput As GdiplusStartupInput, GdiplusStartupOutput As Long) As Long
Private Declare Function GdipCreateFromHDC Lib "gdiplus.dll" (ByVal hDC As Long, GpGraphics As Long) As Long
Private Declare Function GdipSetInterpolationMode Lib "gdiplus.dll" (ByVal Graphics As Long, ByVal InterMode As Long) As Long
Private Declare Function GdipDrawImageRectI Lib "gdiplus.dll" (ByVal Graphics As Long, ByVal Img As Long, ByVal x As Long, ByVal y As Long, ByVal Width As Long, ByVal Height As Long) As Long
Private Declare Function GdipDeleteGraphics Lib "gdiplus.dll" (ByVal Graphics As Long) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus.dll" (ByVal Image As Long) As Long
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus.dll" (ByVal hBmp As Long, ByVal hPal As Long, GpBitmap As Long) As Long
Private Declare Function GdipGetImageWidth Lib "gdiplus.dll" (ByVal Image As Long, Width As Long) As Long
Private Declare Function GdipGetImageHeight Lib "gdiplus.dll" (ByVal Image As Long, Height As Long) As Long
Private Declare Function GdipCreateMetafileFromWmf Lib "gdiplus.dll" (ByVal hWmf As Long, ByVal deleteWmf As Long, WmfHeader As wmfPlaceableFileHeader, Metafile As Long) As Long
Private Declare Function GdipCreateMetafileFromEmf Lib "gdiplus.dll" (ByVal hEmf As Long, ByVal deleteEmf As Long, Metafile As Long) As Long
Private Declare Function GdipCreateBitmapFromHICON Lib "gdiplus.dll" (ByVal hIcon As Long, GpBitmap As Long) As Long
Private Declare Function GdipDrawImageRectRectI Lib "gdiplus.dll" (ByVal Graphics As Long, ByVal GpImage As Long, ByVal dstx As Long, ByVal dsty As Long, ByVal dstwidth As Long, ByVal dstheight As Long, ByVal srcx As Long, ByVal srcy As Long, ByVal srcwidth As Long, ByVal srcheight As Long, ByVal srcUnit As Long, ByVal imageAttributes As Long, ByVal callback As Long, ByVal callbackData As Long) As Long
Private Declare Sub GdiplusShutdown Lib "gdiplus.dll" (ByVal Token As Long)
Private Const PLANES = 14             '   Number of planes
Private Const BITSPIXEL = 12          '   Number of bits per pixel
Private Const PATCOPY = &HF00021      ' (DWORD) dest = pattern
Private Const PICTYPE_BITMAP = 1      ' Bitmap type
Private Const InterpolationModeHighQualityBicubic = 7
Private Const GDIP_WMF_PLACEABLEKEY = &H9AC6CDD7
Private Const UnitPixel = 2

Public Function InitGDIPlus() As Long
     Dim Token     As Long
     Dim gdipInit As GdiplusStartupInput
    
     gdipInit.GdiplusVersion = 1
     GdiplusStartup Token, gdipInit, ByVal 0&
     InitGDIPlus = Token
End Function

Public Sub FreeGDIPlus(Token As Long)
     GdiplusShutdown Token
End Sub

Public Function LoadPictureGDIPlus(PicFile As String, Optional Width As Long = -1, Optional Height As Long = -1, Optional ByVal BackColor As Long = vbWhite, Optional RetainRatio As Boolean = False) As IPicture
     Dim hDC      As Long
     Dim hBitmap As Long
     Dim Img      As Long
        

     If GdipLoadImageFromFile(StrPtr(PicFile), Img) <> 0 Then
         Err.Raise 999, "GDI+ Module", "Error loading picture " & PicFile
         Exit Function
     End If
    

     If Width = -1 Or Height = -1 Then
         GdipGetImageWidth Img, Width
         GdipGetImageHeight Img, Height
     End If
    

     InitDC hDC, hBitmap, BackColor, Width, Height

     gdipResize Img, hDC, Width, Height, RetainRatio
     GdipDisposeImage Img
    

     GetBitmap hDC, hBitmap

     Set LoadPictureGDIPlus = CreatePicture(hBitmap)
End Function

Private Sub InitDC(hDC As Long, hBitmap As Long, BackColor As Long, Width As Long, Height As Long)
     Dim hBrush As Long
        

     hDC = CreateCompatibleDC(ByVal 0&)
     hBitmap = CreateBitmap(Width, Height, GetDeviceCaps(hDC, PLANES), GetDeviceCaps(hDC, BITSPIXEL), ByVal 0&)
     hBitmap = SelectObject(hDC, hBitmap)
     hBrush = CreateSolidBrush(BackColor)
     hBrush = SelectObject(hDC, hBrush)
     PatBlt hDC, 0, 0, Width, Height, PATCOPY
     DeleteObject SelectObject(hDC, hBrush)
End Sub

Private Sub gdipResize(Img As Long, hDC As Long, Width As Long, Height As Long, Optional RetainRatio As Boolean = False)
     Dim Graphics    As Long       ' Graphics Object Pointer
     Dim OrWidth     As Long       ' Original Image Width
     Dim OrHeight    As Long       ' Original Image Height
     Dim OrRatio     As Double     ' Original Image Ratio
     Dim DesRatio    As Double     ' Destination rect Ratio
     Dim DestX       As Long       ' Destination image X
     Dim DestY       As Long       ' Destination image Y
     Dim DestWidth   As Long       ' Destination image Width
     Dim DestHeight As Long       ' Destination image Height
    
     GdipCreateFromHDC hDC, Graphics
     GdipSetInterpolationMode Graphics, InterpolationModeHighQualityBicubic
    
     If RetainRatio Then
         GdipGetImageWidth Img, OrWidth
         GdipGetImageHeight Img, OrHeight
        
         OrRatio = OrWidth / OrHeight
         DesRatio = Width / Height
        
         ' Calculate destination coordinates
         DestWidth = IIf(DesRatio < OrRatio, Width, Height * OrRatio)
         DestHeight = IIf(DesRatio < OrRatio, Width / OrRatio, Height)

         DestX = 0
         DestY = 0
         GdipDrawImageRectRectI Graphics, Img, DestX, DestY, DestWidth, DestHeight, 0, 0, OrWidth, OrHeight, UnitPixel, 0, 0, 0
     Else
         GdipDrawImageRectI Graphics, Img, 0, 0, Width, Height
     End If
     GdipDeleteGraphics Graphics
End Sub

Private Sub GetBitmap(hDC As Long, hBitmap As Long)
     hBitmap = SelectObject(hDC, hBitmap)
     DeleteDC hDC
End Sub

Private Function CreatePicture(hBitmap As Long) As IPicture
     Dim IID_IDispatch As GUID
     Dim Pic            As PICTDESC
     Dim IPic           As IPicture
    

     IID_IDispatch.Data1 = &H20400
     IID_IDispatch.Data4(0) = &HC0
     IID_IDispatch.Data4(7) = &H46
        

     Pic.size = Len(Pic)         ' Length of structure
     Pic.Type = PICTYPE_BITMAP   ' Type of Picture (bitmap)
     Pic.hBmp = hBitmap          ' Handle to bitmap
     ' Create the picture
     OleCreatePictureIndirect Pic, IID_IDispatch, True, IPic
     Set CreatePicture = IPic
End Function

Public Function Resize(Handle As Long, PicType As PictureTypeConstants, Width As Long, Height As Long, Optional BackColor As Long = vbWhite, Optional RetainRatio As Boolean = False) As IPicture
     Dim Img        As Long
     Dim hDC        As Long
     Dim hBitmap    As Long
     Dim WmfHeader As wmfPlaceableFileHeader
    

     Select Case PicType
     Case vbPicTypeBitmap
          GdipCreateBitmapFromHBITMAP Handle, ByVal 0&, Img
     Case vbPicTypeMetafile
          FillInWmfHeader WmfHeader, Width, Height
          GdipCreateMetafileFromWmf Handle, False, WmfHeader, Img
     Case vbPicTypeEMetafile
          GdipCreateMetafileFromEmf Handle, False, Img
     Case vbPicTypeIcon
          ' Does not return a valid Image object
          GdipCreateBitmapFromHICON Handle, Img
     End Select
    

     If Img Then
         InitDC hDC, hBitmap, BackColor, Width, Height
         gdipResize Img, hDC, Width, Height, RetainRatio
         GdipDisposeImage Img
         GetBitmap hDC, hBitmap
         Set Resize = CreatePicture(hBitmap)
     End If
End Function
Private Sub FillInWmfHeader(WmfHeader As wmfPlaceableFileHeader, Width As Long, Height As Long)
     WmfHeader.BoundingBox.Right = Width
     WmfHeader.BoundingBox.Bottom = Height
     WmfHeader.Inch = 1440
     WmfHeader.Key = GDIP_WMF_PLACEABLEKEY
End Sub


------解决思路----------------------
用户控件同样可以调试,打开用户控件的项目,选择工程-属性
调试里面选等待对象,选择调用它的exe作为启动对象
然后f5调试

看你的错误发生在哪一行。
------解决思路----------------------
在控件工程下面再添加一个测试工程,变成一个工程组, 这样就可以直接调试了