Search the Community
Showing results for tags 'Resource dll'.
-
Hello, I just added a few scripts together to get a function for creating a resource dll. You can add icons und pictures to the library for now. I hope you like it. #include <WinAPIEx.au3> #include <Array.au3> #include <APIConstants.au3> #include <GDIPlus.au3> #include <Memory.au3> #include <StaticConstants.au3> Global $sDLL = @ScriptDir & "Resourcen.dll" Global $sTempFile, $aFiles[1] Global Const $tagICONDIRENTRY = "BYTE bWidth;BYTE bHeight;BYTE bColorCount;BYTE bReserved;WORD wPlanes;WORD wBitCount;DWORD dwBytesInRes;DWORD dwImageOffset" Global Const $tagGRPICONDIRENTRY = "BYTE bWidth;BYTE bHeight;BYTE bColorCount;BYTE bReserved;WORD wPlanes;WORD wBitCount;DWORD dwBytesInRes;WORD nID" Global Const $SS_REALSIZECONTROL = 0x40 While 1 $sTempFile = FileOpenDialog("Select resource files", @ScriptDir, "All files (*.*)|Icons (*.ico)|Bitmaps (*.bmp)", 3) If @error Then ExitLoop If $aFiles[0] = "" Then $aFiles[0] = $sTempFile Else _ArrayAdd($aFiles, $sTempFile) EndIf WEnd _CreateResourceDLL($sDLL, $aFiles) Global $aIcon = _ArrayFindAll($aFiles, ".ico", 0, 0, 0, 1, 0) Global $aBitmap = _ArrayFindAll($aFiles, ".bmp", 0, 0, 0, 1, 0) Global $aJpg = _ArrayFindAll($aFiles, ".jpg", 0, 0, 0, 1, 0) GUICreate("Resource DLL", 800, 800) If IsArray($aIcon) Then For $i = 0 To UBound($aIcon) - 1 GUICtrlCreateIcon($sDLL, $aFiles[$aIcon[$i]], 10, 10 + 40 * $i, 32, 32, $SS_SUNKEN) GUICtrlCreateLabel($aFiles[$aIcon[$i]], 50, 10 + 40 * $i, 120, 32, $SS_CENTERIMAGE) Next EndIf If IsArray($aBitmap) Then For $i = 0 To UBound($aBitmap) - 1 GUICtrlCreatePic("", 200, 30 + 120 * $i, 100, 100, BitOR($SS_REALSIZECONTROL, $SS_SUNKEN)) _SetImagefromResource(-1, $aFiles[$aBitmap[$i]], $sDLL, $RT_BITMAP) GUICtrlCreatePic("", 310, 30 + 120 * $i, 100, 100, BitOR($SS_CENTERIMAGE, $SS_SUNKEN)) _SetImagefromResource(-1, $aFiles[$aBitmap[$i]], $sDLL, $RT_BITMAP) GUICtrlCreateLabel($aFiles[$aBitmap[$i]], 200, 10 + 120 * $i, 120, 20, 0x200) Next EndIf If IsArray($aJpg) Then For $i = 0 To UBound($aJpg) - 1 GUICtrlCreatePic("", 440, 30 + 120 * $i, 100, 100, BitOR($SS_REALSIZECONTROL, $SS_SUNKEN)) _SetImagefromResource(-1, $aFiles[$aJpg[$i]], $sDLL, $RT_RCDATA) GUICtrlCreatePic("", 550, 30 + 120 * $i, 100, 100, BitOR($SS_CENTERIMAGE, $SS_SUNKEN)) _SetImagefromResource(-1, $aFiles[$aJpg[$i]], $sDLL, $RT_RCDATA) GUICtrlCreateLabel($aFiles[$aJpg[$i]], 440, 10 + 120 * $i, 120, 20, 0x200) Next EndIf GUISetState() Do Until GUIGetMsg() = -3 Func _CreateResourceDLL($sDLL, ByRef $aFiles) If Not IsArray($aFiles) Or $aFiles[0] = "" Then Return SetError(1, 0, 0) _CreateEmptyDLL($sDLL) Local $hUpdate = _WinAPI_BeginUpdateResource($sDLL, 0) If @error Then Return SetError(2, 0, 0) Local $hFile, $bFile, $lFile, $tFile, $pFile, $sName, $sExt, $RT_TYPE, $Resource_ID = 0 Local $tICONDIR, $tICONDIRENTRY, $tGRPICONDIR, $pGRPICONDIR Local $Temp Local $nSize For $i = 0 To UBound($aFiles) - 1 If Not FileExists($aFiles[$i]) Then SetError(3, 0, 0) $hFile = FileOpen($aFiles[$i], 0) $bFile = FileRead($hFile) FileClose($hFile) $lFile = FileGetSize($aFiles[$i]) $tFile = DllStructCreate("char[" & $lFile & "]") DllStructSetData($tFile, 1, $bFile) $pFile = DllStructGetPtr($tFile) $sName = StringUpper(StringTrimLeft($aFiles[$i], StringInStr($aFiles[$i], "", 0, -1))) $sExt = StringTrimLeft($aFiles[$i], StringInStr($aFiles[$i], ".", 0, -1)) $aFiles[$i] = $sName Switch $sExt Case "bmp" $RT_TYPE = $RT_BITMAP $lFile = $lFile - 14 $pFile = Ptr($pFile + 14) Case "ico" $RT_TYPE = $RT_ICON Local $tB_Input_Header = DllStructCreate("short res;short type;short ImageCount;char rest[" & $lFile - 5 & "]", $pFile) Local $pB_Input_Header = DllStructGetPtr($tB_Input_Header) Local $IconType = DllStructGetData($tB_Input_Header, "Type") Local $IconCount = DllStructGetData($tB_Input_Header, "ImageCount") Local $tB_IconGroupHeader = DllStructCreate("short Res;short Type;short ImageCount;char Rest[" & $IconCount * 14 & "]") Local $pB_IconGroupHeader = DllStructGetPtr($tB_IconGroupHeader) DllStructSetData($tB_IconGroupHeader, "Res", 0) DllStructSetData($tB_IconGroupHeader, "Type", $IconType) DllStructSetData($tB_IconGroupHeader, "ImageCount", $IconCount) For $X = 1 To $IconCount Local $pB_Input_IconHeader = DllStructGetPtr($tB_Input_Header, 4) + ($X - 1) * 16 Local $tB_Input_IconHeader = DllStructCreate($tagICONDIRENTRY, $pB_Input_IconHeader) Local $IconWidth = DllStructGetData($tB_Input_IconHeader, "bWidth") Local $IconHeigth = DllStructGetData($tB_Input_IconHeader, "bHeight") Local $IconColors = DllStructGetData($tB_Input_IconHeader, "bColorCount") Local $IconPlanes = DllStructGetData($tB_Input_IconHeader, "wPlanes") Local $IconBitPerPixel = DllStructGetData($tB_Input_IconHeader, "wBitCount") Local $IconImageSize = DllStructGetData($tB_Input_IconHeader, "dwBytesInRes") Local $IconImageOffset = DllStructGetData($tB_Input_IconHeader, "dwImageOffset") $pB_IconGroupHeader = DllStructGetPtr($tB_IconGroupHeader, 4) + ($X - 1) * 14 Local $tB_GroupIcon = DllStructCreate($tagGRPICONDIRENTRY, $pB_IconGroupHeader) DllStructSetData($tB_GroupIcon, "bWidth", $IconWidth) DllStructSetData($tB_GroupIcon, "bHeigth", $IconHeigth) DllStructSetData($tB_GroupIcon, "bColorCount", $IconColors) DllStructSetData($tB_GroupIcon, "bReserved", 0) DllStructSetData($tB_GroupIcon, "wPlanes", $IconPlanes) DllStructSetData($tB_GroupIcon, "wBitCount", $IconBitPerPixel) DllStructSetData($tB_GroupIcon, "dwBytesInRes", $IconImageSize) $Resource_ID += 1 DllStructSetData($tB_GroupIcon, "nID", $Resource_ID) Local $PB_IconData = DllStructGetPtr($tB_Input_Header) + $IconImageOffset _WinAPI_UpdateResource($hUpdate, $RT_TYPE, $Resource_ID, Int("0x" & @OSLang), $PB_IconData, $IconImageSize) Next $pB_IconGroupHeader = DllStructGetPtr($tB_IconGroupHeader) Case "jpg", "jpeg", "gif" $RT_TYPE = $RT_RCDATA ;~ Case "cur" ;~ $RT_TYPE = $RT_CURSOR ;~ Case "txt", "au3", "ini", "c", "cpp", "h" ;~ $RT_TYPE = $RT_STRING Case Else ContinueLoop EndSwitch If $RT_TYPE = $RT_ICON Then _WinAPI_UpdateResource($hUpdate, $RT_GROUP_ICON, $sName, Int("0x" & @OSLang), $pB_IconGroupHeader, DllStructGetSize($tB_IconGroupHeader)) Else $Resource_ID += 1 _WinAPI_UpdateResource($hUpdate, $RT_TYPE, $sName, Int("0x" & @OSLang), $pFile, $lFile) EndIf ;~ If @error Then SetError(4, $i, 0) $tFile = 0 Next _WinAPI_EndUpdateResource($hUpdate) If @error Then Return SetError(5, @extended) Return 1 EndFunc ;==>_CreateResourceDLL Func _CreateEmptyDLL($sFilePath) Local $bEmptyDll = _Empty_DLL() Local $hFile = FileOpen($sFilePath, 18) ;Binary mode + Write mode (Erase old content!) FileWrite($hFile, $bEmptyDll) FileClose($hFile) EndFunc ;==>_CreateEmptyDLL Func _Empty_DLL() Local $Empty_DLL $Empty_DLL &= 'TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAEFAP6WNU0AAAAAAAAAAOAADiELAQIyAAQAAAAGAAAAAAAAABAAAAAQAAAAMAAAAAAAEAAQAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAABAAAAAAAAAMAAAAAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAAAwAAA8AAAAAFAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAC' $Empty_DLL &= 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUMAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5jb2RlAAAAYwAAAAAQAAAAAgAAAAQAAAAAAAAAAAAAAAAAACAAAGAudGV4dAAAABgAAAAAIAAAAAIAAAAGAAAAAAAAAAAAAAAAAAAgAABgLmRhdGEAAADMAAAAADAAAAACAAAACAAAAAAAAAAAAAAAAAAAQAAAwC5yZWxvYwAAIAAAAABAAAAAAgAAAAoAAAAAAAAAAAAAAAAAAEAAAEIucnNyYwAAABAAAAAAUAAAAAIAAAAMAAAAAAAAAAAAAAAAAABAAAB' $Empty_DLL &= StringRepeat("A", 598) & 'IN8JAgBdQ6LRCQEo8QwABDoIgAAAIN8JAgCdQCDfCQIAHUF6CkAAACDfCQIA3UAuAEAAADCDABoAAAAAGgAEAAAaAAAAADouw8AAKPAMAAQw+gMAAAA/zXAMAAQ6KsPAADDww' $Empty_DLL &= StringRepeat("A", 550) & '/yVUMAAQ/yVcMAAQ/yVgMAAQ/yVkMAAQ' $Empty_DLL &= StringRepeat("A", 651) $Empty_DLL &= '8MAAAAAAAAAAAAAB2MAAAVDAAAEQwAAAAAAAAAAAAALIwAABcMAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsMAAAAAAAAIIwAACQMAAAnjAAAAAAAABsMAAAAAAAAIIwAACQMAAAnjAAAAAAAACZAm1lbXNldAAATVNWQ1JULmRsbAAApAJIZWFwQ3JlYXRlAAClAkhlYXBEZXN0cm95APoBR2V0TW9kdWxlSGFuZGxlVwAAS0VSTkVMMzIuZGxs' $Empty_DLL &= StringRepeat("A", 431) & 'QAAAQAAAADDBMMFgwAAAAIAAAEAAAAAIwCDAOMBQw' $Empty_DLL &= StringRepeat("A", 645) & 'BSXNk0DAAc' $Empty_DLL &= StringRepeat("A", 668) & '=' Return Binary(_Base64Decode($Empty_DLL)) EndFunc ;==>_Empty_DLL Func _Base64Decode($input_string) Local $struct = DllStructCreate("int") Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", 0, "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0) If @error Or Not $a_Call[0] Then Return SetError(1, 0, "") Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]") $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", DllStructGetPtr($a), "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0) If @error Or Not $a_Call[0] Then Return SetError(2, 0, "") Return DllStructGetData($a, 1) EndFunc ;==>_Base64Decode Func StringRepeat($sChar, $nCount) $tBuffer = DllStructCreate("char[" & $nCount + 1 & "]") DllCall("msvcrt.dll", "ptr:cdecl", "memset", "ptr", DllStructGetPtr($tBuffer), "int", Asc($sChar), "int", $nCount) Return DllStructGetData($tBuffer, 1) EndFunc ;==>StringRepeat Func _SetImagefromResource($CtrlID, $Resname, $Resfile = -1, $ResType = 10) ;Raupi ;Diese Funktion basiert auf der UDF von Zedna@Autitscript.com und Code von Progandy@AutoIt.de Local Const $IMAGE_BITMAP = 0 Local Const $STM_SETIMAGE = 0x0172 Local $hmod, $hwnd, $InfoBlock, $ResSize, $Mem, $pMem, $dll, $dll2, $hData, $pData, $pStream, $ret, $hBitmap, $pBitmap If $Resfile = -1 Then $hmod = _WinAPI_GetModuleHandle("") Else $hmod = _WinAPI_LoadLibrary($Resfile) EndIf If $ResType = $RT_BITMAP Then $hBitmap = _WinAPI_LoadImage($hmod, $Resname, $IMAGE_BITMAP, 0, 0, 0) If @error Then Return SetError(1, 0, 0) $hwnd = GUICtrlGetHandle($CtrlID) If $hwnd = 0 Then Return SetError(2, 0, 0) DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hwnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap) If @error Then Return SetError(3, 0, 0) Else $InfoBlock = DllCall("kernel32.dll", "int", "FindResourceA", "int", $hmod, "str", $Resname, "long", $ResType) If @error Then Return SetError(4, 0, 0) $InfoBlock = $InfoBlock[0] If $InfoBlock = 0 Then Return SetError(5, 0, 0) $ResSize = DllCall("kernel32.dll", "dword", "SizeofResource", "int", $hmod, "int", $InfoBlock) If @error Then Return SetError(6, 0, 0) $ResSize = $ResSize[0] If $ResSize = 0 Then Return SetError(7, 0, 0) $Mem = DllCall("kernel32.dll", "int", "LoadResource", "int", $hmod, "int", $InfoBlock) If @error Then Return SetError(8, 0, 0) $Mem = $Mem[0] If $Mem = 0 Then Return SetError(9, 0, 0) $pMem = DllCall("kernel32.dll", "int", "LockResource", "int", $Mem) If @error Then Return SetError(8, 0, 0) $pMem = $pMem[0] If $pMem = 0 Then Return SetError(10, 0, 0) If $Resfile <> -1 Then DllCall("Kernel32.dll", "int", "FreeLibrary", "str", $hmod) $hData = _MemGlobalAlloc($ResSize, 2) $pData = _MemGlobalLock($hData) _MemMoveMemory($pMem, $pData, $ResSize) _MemGlobalUnlock($hData) $ret = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "int", $hData, "long", 1, "Int*", 0) $pStream = $ret[3] _GDIPlus_Startup() $pBitmap = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromStream", "ptr", $pStream, "int*", 0) $pBitmap = $pBitmap[2] $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap) $hwnd = GUICtrlGetHandle($CtrlID) If $hwnd = 0 Then Return SetError(11, 0, 0) DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hwnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap) If @error Then Return SetError(12, 0, 0) _GDIPlus_BitmapDispose($pBitmap) _GDIPlus_Shutdown() $dll = DllStructCreate("Uint", $pStream) $dll2 = DllStructCreate("uInt", DllStructGetData($dll, 1) + 8) DllCall("", "UInt", DllStructGetData($dll2, 1), "UInt", $pStream) _WinAPI_DeleteObject($pStream) $pStream = 0 _MemGlobalFree($hData) If $Resfile <> -1 Then _WinAPI_FreeLibrary($hmod) EndIf EndFunc ;==>_SetImagefromResource Download au3 Download au3 with function for icons, pictures(bmp, jpg, gif), fonts(only ttf tested) Download new au3 without temp file creating in example part