vbAccelerator - Contents of code file: mResource.bas
Attribute VB_Name = "mResource"
Option Explicit
Private Declare Function EnumResourceLanguages Lib "kernel32" Alias
"EnumResourceLanguagesA" (ByVal hModule As Long, ByVal lpType As String, ByVal
lpName As String, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function EnumResourceNamesByNum Lib "kernel32" Alias
"EnumResourceNamesA" (ByVal hModule As Long, ByVal lpType As Long, ByVal
lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function EnumResourceNamesByAny Lib "kernel32" Alias
"EnumResourceNamesA" (ByVal hModule As Long, lpType As Any, ByVal lpEnumFunc
As String, ByVal lParam As Long) As Long
Private Declare Function EnumResourceTypes Lib "kernel32" Alias
"EnumResourceTypesA" (ByVal hModule As Long, ByVal lpEnumFunc As Long, ByVal
lParam As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal
lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long,
ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As
Long
Private Const GMEM_ZEROINIT = &H40
Private Const GMEM_FIXED = &H0
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)
Private Declare Function LoadImageLong Lib "user32" Alias "LoadImageA" (ByVal
hInst As Long, ByVal lpsz As Long, ByVal uType As Long, ByVal cx As Long,
ByVal cy As Long, ByVal uFlags As Long) As Long
Private Declare Function LoadImageString Lib "user32" Alias "LoadImageA" (ByVal
hInst As Long, ByVal lpsz As String, ByVal uType As Long, ByVal cx As Long,
ByVal cy As Long, ByVal uFlags As Long) As Long
Private Const IMAGE_BITMAP = 0
Private Const IMAGE_ICON = 1
Private Const IMAGE_CURSOR = 2
Private Const LR_DEFAULTCOLOR = &H0
Private Const LR_MONOCHROME = &H1
Private Const LR_COLOR = &H2
Private Const LR_COPYRETURNORG = &H4
Private Const LR_COPYDELETEORG = &H8
Private Const LR_LOADFROMFILE = &H10
Private Const LR_LOADTRANSPARENT = &H20
Private Const LR_DEFAULTSIZE = &H40
Private Const LR_VGACOLOR = &H80
Private Const LR_LOADMAP3DCOLORS = &H1000
Private Const LR_CREATEDIBSECTION = &H2000
Private Const LR_COPYFROMRESOURCE = &H4000
Private Const LR_SHARED = &H8000&
Private Declare Function LoadStringAsAny Lib "user32" Alias "LoadStringA"
(ByVal hInstance As Long, wID As Any, ByVal lpBuffer As String, ByVal
nBufferMax As Long) As Long
Private Declare Function LoadStringWAsAny Lib "user32" Alias "LoadStringW"
(ByVal hInstance As Long, wID As Any, lpBuffer As Any, ByVal nBufferMax As
Long) As Long
Private Declare Function FindResource Lib "kernel32" Alias "FindResourceA"
(ByVal hInstance As Long, lpName As Any, lpType As Any) As Long
Private Declare Function LockResource Lib "kernel32" (ByVal hResData As Long)
As Long
Private Declare Function LoadResource Lib "kernel32" (ByVal hInstance As Long,
ByVal hResInfo As Long) As Long
Private Declare Function SizeofResource Lib "kernel32" (ByVal hInstance As
Long, ByVal hResInfo As Long) As Long
Private Declare Function FreeResource Lib "kernel32" (ByVal hResData As Long)
As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As
Long
Private Type BITMAPINFOHEADER '40 bytes
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private m_cR As cResources
Public Property Get DIBSectionFromResource( _
ByVal hMod As Long, _
ByVal sName As String, _
ByVal bPreMultiplyAlpha As Boolean, _
ByRef bColorDepth As Byte _
) As cAlphaDibSection
Dim lID As Long
Dim hBmp As Long
Dim lErr As Long
Dim hRes As Long
Dim hGbl As Long
Dim lSize As Long
Dim lPtr As Long
Dim tb As BITMAPINFOHEADER
' Check the color depth of the original:
If IsNumeric(sName) Then
sName = "#" & sName
End If
hRes = FindResource(hMod, ByVal sName, ByVal CLng(crBitmap))
If Not hRes = 0 Then
hGbl = LoadResource(hMod, hRes)
If Not hGbl = 0 Then
lSize = SizeofResource(hMod, hRes)
If (lSize > LenB(tb)) Then
lPtr = LockResource(hGbl)
CopyMemory tb, ByVal lPtr, 40
End If
End If
FreeResource hRes
End If
' Load the image & create a DIB section:
If IsNumeric(sName) Then
lID = CLng(sName)
hBmp = LoadImageLong(hMod, lID, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION)
Else
hBmp = LoadImageString(hMod, sName, IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION)
End If
If Not hBmp = 0 Then
bColorDepth = tb.biBitCount
Dim cD As New cAlphaDibSection
cD.CreateFromHBitmap (hBmp)
DeleteObject hBmp
If (bPreMultiplyAlpha) Then
If (bColorDepth < 32) Then
cD.SetAlpha 255
Else
If (cD.AreAllAlphaBytesZero) Then
cD.SetAlpha 255
Else
cD.PreMultiplyAlpha
End If
End If
End If
Set DIBSectionFromResource = cD
Else
lErr = Err.LastDllError
Err.Raise vbObjectError + 1048 + 3, App.EXEName & ".cResource",
WinError(lErr)
End If
End Property
Public Property Get PictureFromResource( _
ByVal hMod As Long, _
ByVal sName As String, _
ByVal eType As CRStandardResourceTypeConstants _
) As IPicture
Dim hBmp As Long
Dim hIcon As Long
Dim hCur As Long
Dim lErr As Long
Dim lID As Long
If eType = crBitmap Then
If IsNumeric(sName) Then
lID = CLng(sName)
hBmp = LoadImageLong(hMod, lID, IMAGE_BITMAP, 0, 0, 0)
Else
hBmp = LoadImageString(hMod, sName, IMAGE_BITMAP, 0, 0, 0)
End If
If Not hBmp = 0 Then
Set PictureFromResource = BitmapToPicture(hBmp)
Else
lErr = Err.LastDllError
Err.Raise vbObjectError + 1048 + 3, App.EXEName & ".cResource",
WinError(lErr)
End If
ElseIf eType = crGroupIcon Then
If IsNumeric(sName) Then
lID = CLng(sName)
hIcon = LoadImageLong(hMod, lID, IMAGE_ICON, 0, 0, 0)
Else
hIcon = LoadImageString(hMod, sName, IMAGE_ICON, 0, 0, 0)
End If
If Not hIcon = 0 Then
Set PictureFromResource = IconToPicture(hIcon)
Else
lErr = Err.LastDllError
Err.Raise vbObjectError + 1048 + 3, App.EXEName & ".cResource",
WinError(lErr)
End If
ElseIf eType = crGroupCursor Then
If IsNumeric(sName) Then
lID = CLng(sName)
hCur = LoadImageLong(hMod, lID, IMAGE_CURSOR, 0, 0, 0)
Else
hCur = LoadImageString(hMod, sName, IMAGE_CURSOR, 0, 0, 0)
End If
If Not hCur = 0 Then
Set PictureFromResource = IconToPicture(hCur)
Else
lErr = Err.LastDllError
Err.Raise vbObjectError + 1048 + 3, App.EXEName & ".cResource",
WinError(lErr)
End If
End If
End Property
Public Sub SaveResource( _
ByVal hMod As Long, _
ByVal sName As String, _
ByVal sType As String, _
ByVal sFile As String _
)
Dim sBuf As String
Dim hGbl As Long
Dim hRes As Long
Dim lID As Long
Dim lSize As Long
Dim lPtr As Long
Dim lR As Long
Dim iFile As Integer
Dim lErr As Long
On Error GoTo ErrorHandler
If IsNumeric(sName) Then
lID = CLng(sName)
sName = "#" & sName
End If
If IsNumeric(sType) Then
hRes = FindResource(hMod, ByVal sName, ByVal CLng(sType))
Else
hRes = FindResource(hMod, ByVal sName, ByVal sType)
End If
If Not hRes = 0 Then
hGbl = LoadResource(hMod, hRes)
If Not hGbl = 0 Then
lPtr = LockResource(hGbl)
If Not lPtr = 0 Then
lSize = SizeofResource(hMod, hRes)
If lSize > 0 Then
ReDim b(0 To lSize) As Byte
CopyMemory b(0), ByVal lPtr, lSize
On Error Resume Next
Kill sFile
On Error GoTo ErrorHandler
iFile = FreeFile
Open sFile For Binary Access Write Lock Read As #iFile
Put #iFile, , b
Close #iFile
iFile = 0
End If
Else
lErr = Err.LastDllError
Err.Raise vbObjectError + 1048 + 4, App.EXEName & ".cResource",
WinError(lErr)
End If
Else
lErr = Err.LastDllError
Err.Raise vbObjectError + 1048 + 3, App.EXEName & ".cResource",
WinError(lErr)
End If
FreeResource hRes
Else
Err.Raise vbObjectError + 1048 + 3, App.EXEName & ".cResource",
"Specified Resource Not Found."
End If
Exit Sub
ErrorHandler:
Err.Raise Err.Number, App.EXEName & ".cResource", Err.Description
If Not (iFile = 0) Then
Close #iFile
End If
Exit Sub
End Sub
Public Function GetResourceNames(cR As cResources, ByVal vType As Variant) As
Long
Dim lR As Long
Dim lErr As Long
Dim lType As Long
Dim sType As String
Dim b() As Byte
Dim lpType As Long
Dim hMem As Long
Dim lPtr As Long
Set m_cR = cR
If (VarType(vType) = vbLong) Then
lType = vType
lR = EnumResourceNamesByNum(cR.hModule, lType, AddressOf
EnumResNamesProc, 0)
Else
sType = vType
b = StrConv(sType, vbFromUnicode)
ReDim Preserve b(0 To UBound(b) + 1) As Byte
hMem = GlobalAlloc(GPTR, UBound(b) + 1)
If Not hMem = 0 Then
lPtr = GlobalLock(hMem)
If Not lPtr = 0 Then
CopyMemory ByVal lPtr, b(0), UBound(b) + 1
lR = EnumResourceNamesByNum(cR.hModule, lPtr, AddressOf
EnumResNamesProc, 0)
GlobalUnlock lPtr
End If
GlobalFree hMem
End If
End If
If (lR = 0) Then
lErr = Err.LastDllError
Err.Raise vbObjectError + 1048 + 2, App.EXEName & ".cResource",
WinError(lErr)
End If
Set m_cR = Nothing
GetResourceNames = lR
End Function
Public Function EnumResNamesProc( _
ByVal hMod As Long, _
ByVal lpszType As Long, _
ByVal lpszName As Long, _
ByVal lParam As Long _
) As Long
Dim sName As String
Dim lName As Long
Dim b() As Byte
Dim lLen As Long
If (lpszName And &HFFFF0000) = 0 Then
' resource number:
lName = lpszName And &HFFFF&
m_cR.AddResourceName lName, ""
Else
' resource string:
lLen = lstrlen(lpszName)
If (lLen > 0) Then
ReDim b(0 To lLen - 1) As Byte
CopyMemory b(0), ByVal lpszName, lLen
sName = StrConv(b, vbUnicode)
End If
m_cR.AddResourceName 0, sName
End If
EnumResNamesProc = 1
End Function
Public Function GetResourceTypes(cR As cResources) As Long
Dim lR As Long
Dim lErr As Long
Set m_cR = cR
lR = EnumResourceTypes(cR.hModule, AddressOf EnumResTypesProc, 0)
If (lR = 0) Then
lErr = Err.LastDllError
Set m_cR = Nothing
Err.Raise vbObjectError + 1048 + 1, App.EXEName & ".cResource",
WinError(lErr)
End If
Set m_cR = Nothing
GetResourceTypes = lR
End Function
Private Function EnumResTypesProc( _
ByVal hMod As Long, _
ByVal lpszType As Long, _
ByVal lParam As Long _
) As Long
Dim lType As Long
Dim sType As String
Dim lLen As Long
Dim b() As Byte
If (lpszType And &HFFFF0000) = 0 Then
' standard resource type:
lType = lpszType And &HFFFF&
m_cR.AddResourceType lType, ""
Else
' string:
lLen = lstrlen(lpszType)
If (lLen > 0) Then
ReDim b(0 To lLen - 1) As Byte
CopyMemory b(0), ByVal lpszType, lLen
sType = StrConv(b, vbUnicode)
End If
m_cR.AddResourceType 0, sType
End If
EnumResTypesProc = 1
End Function
|
|