Jump to content

Embedded picture in compiled File


Recommended Posts

Hi All,

I'm newbe in AutoIT...

I use this line in my script to display an picture in my GUI.

CODE
$MainForm = GUICreate("My Form", 584, 212)

...

$Pic1 = GUICtrlCreatePic("C:\Sources\My Project\MyPicture.bmp", 432, 3, 147, 66)

...

But when exporting the compiled executable, the picture was not included, it does not appear ...

Could someone help me to integrate this picture in the executable?

Thank you in advance.

NDTC.

Link to comment
Share on other sites

you need "reshacker.exe" and then you can embed it

#Region AutoIt3Wrapper directives section

#AutoIt3Wrapper_UseUpx=n

;; add icon 
#AutoIt3Wrapper_Icon=earth.ico

#AutoIt3Wrapper_Run_After=c:\ResHacker.exe -add resource_test.exe, resource_test.exe, image1.bmp , 2, TEST_BMP_1, 0
#AutoIt3Wrapper_Run_After=c:\ResHacker.exe -add resource_test.exe, resource_test.exe, image2.bmp , 2, TEST_BMP_2, 0
#AutoIt3Wrapper_run_after=c:\ResHacker.exe -add %out%, %out%, test_1.gif, 23, TEST_GIF_1, 0

#AutoIt3Wrapper_Run_After=c:\upx.exe  --compress-resources=0 resource_test.exe

#EndRegion





#include "resources.au3"
 
$gui = GUICreate("Data from resources example",820,400)
$pic1 = GUICtrlCreatePic("",0,0,400,300)
$pic2 = GUICtrlCreatePic("",400,0,400,300)
$label = GUICtrlCreateLabel("test",20,320,800,100)
GUISetState(@SW_SHOW)

; get string from resource
;$string = _ResourceGetAsString("TEST_TXT_1")
;GUICtrlSetData($label, $string)


; set image to picture control from resource  bitmap
_ResourceSetImageToCtrl($pic1, "TEST_BMP_1", $RT_BITMAP)

; set image to picture control from resource  bitmap
_ResourceSetImageToCtrl($pic2, "TEST_GIF_1", $RT_BITMAP)


While 1
    If GUIGetMsg() = -3 Then Exit
WEndoÝ÷ Ù©Ý­ë(º·±«·jëh×6#include-once

Global Const $RT_CURSOR = 1
Global Const $RT_BITMAP = 2
Global Const $RT_ICON = 3
Global Const $RT_MENU = 4
Global Const $RT_DIALOG = 5
Global Const $RT_STRING = 6
Global Const $RT_FONTDIR = 7
Global Const $RT_FONT = 8
Global Const $RT_ACCELERATORS = 9
Global Const $RT_RCDATA = 10
Global Const $RT_MESSAGETABLE = 11
Global Const $RT_GROUP_CURSOR = 12
Global Const $RT_GROUP_ICON = 14
Global Const $RT_VERSION = 16

Global Const $RT_ANICURSOR = 21
Global Const $RT_ANIICON = 22
Global Const $RT_HTML = 23
Global Const $RT_MANIFEST = 24

Global Const $SND_RESOURCE = 0x00040004
Global Const $SND_SYNC = 0x0
Global Const $SND_ASYNC = 0x1
Global Const $SND_LOOP = 0x8
Global Const $SND_NOSTOP = 0x10
Global Const $SND_NOWAIT = 0x2000
Global Const $SND_PURGE = 0x40

Func _ResourceGet($ResName, $ResType = 10, $ResLang = 0) ; $RT_RCDATA = 10
    Local Const $IMAGE_BITMAP = 0
    Local $hInstance, $hBitmap, $InfoBlock, $GlobalMemoryBlock, $MemoryPointer, $ResSize
    
    $hInstance = DllCall("kernel32.dll", "int", "GetModuleHandleA", "int", 0)
    $hInstance = $hInstance[0]

    If $ResType = $RT_BITMAP Then
        $hBitmap = DllCall("user32.dll", "hwnd", "LoadImage", "hwnd", $hInstance, "str", $ResName, _
                "int", $IMAGE_BITMAP, "int", 0, "int", 0, "int", 0)
        If @error Then Return SetError(1, 0, 0)
        $hBitmap = $hBitmap[0]
        Return $hBitmap ; returns handle to Bitmap
    EndIf

    If $ResLang <> 0 Then
        $InfoBlock = DllCall("kernel32.dll", "int", "FindResourceExA", "int", $hInstance, "str", $ResName, "long", $ResType, "short", $ResLang)
    Else
        $InfoBlock = DllCall("kernel32.dll", "int", "FindResourceA", "int", $hInstance, "str", $ResName, "long", $ResType)
    EndIf
    
    If @error Then Return SetError(2, 0, 0)
    $InfoBlock = $InfoBlock[0]
    If $InfoBlock = 0 Then Return SetError(3, 0, 0)
    
    $ResSize = DllCall("kernel32.dll", "dword", "SizeofResource", "int", $hInstance, "int", $InfoBlock)
    If @error Then Return SetError(4, 0, 0)
    $ResSize = $ResSize[0]
    If $ResSize = 0 Then Return SetError(5, 0, 0)
    
    $GlobalMemoryBlock = DllCall("kernel32.dll", "int", "LoadResource", "int", $hInstance, "int", $InfoBlock)
    If @error Then Return SetError(6, 0, 0)
    $GlobalMemoryBlock = $GlobalMemoryBlock[0]
    If $GlobalMemoryBlock = 0 Then Return SetError(7, 0, 0)
    
    $MemoryPointer = DllCall("kernel32.dll", "int", "LockResource", "int", $GlobalMemoryBlock)
    If @error Then Return SetError(8, 0, 0)
    $MemoryPointer = $MemoryPointer[0]
    If $MemoryPointer = 0 Then Return SetError(9, 0, 0)
    
    SetExtended($ResSize)
    Return $MemoryPointer
EndFunc

Func _ResourceGetAsString($ResName, $ResType = 10, $ResLang = 0) ; $RT_RCDATA = 10
    Local $ResPointer, $ResSize, $struct

    $ResPointer = _ResourceGet($ResName, $ResType, $ResLang)
    If @error Then
        SetError(1, 0, 0)
        Return ''
    EndIf
    $ResSize = @extended
    $struct = DllStructCreate("char[" & $ResSize & "]", $ResPointer)
    Return DllStructGetData($struct, 1) ; returns string
EndFunc

Func _ResourceGetAsBytes($ResName, $ResType = 10, $ResLang = 0) ; $RT_RCDATA = 10
    Local $ResPointer, $ResSize

    $ResPointer = _ResourceGet($ResName, $ResType, $ResLang)
    If @error Then Return SetError(1, 0, 0)
    $ResSize = @extended
    Return DllStructCreate("byte[" & $ResSize & "]", $ResPointer) ; returns struct with bytes
EndFunc

Func _ResourceSaveToFile($FileName, $ResName, $ResType = 10, $ResLang = 0, $CreatePath = 0) ; $RT_RCDATA = 10
    Local $ResStruct, $ResSize, $FileHandle

    $ResStruct = _ResourceGetAsBytes($ResName, $ResType, $ResLang)
    If @error Then Return SetError(1, 0, 0)
    $ResSize = DllStructGetSize($ResStruct)
    
    If $CreatePath Then $CreatePath = 8 ; mode 8 = Create directory structure if it doesn't exist
    $FileHandle = FileOpen($FileName, 2+16+$CreatePath)
    If @error Then Return SetError(2, 0, 0)
    FileWrite($FileHandle, DllStructGetData($ResStruct, 1))
    If @error Then Return SetError(3, 0, 0)
    FileClose($FileHandle)
    If @error Then Return SetError(4, 0, 0)

    Return $ResSize
EndFunc

Func _ResourceSetImageToCtrl($CtrlId, $ResName, $ResType = 10) ; $RT_RCDATA = 10
    Local $ResData = _ResourceGet($ResName, $ResType)
    If @error Then Return SetError(1, 0, 0)
    
    If $ResType = $RT_BITMAP Then
        _SetBitmapToCtrl($CtrlId, $ResData)
        If @error Then Return SetError(2, 0, 0)
        Return 1
    EndIf
    
    ; for other types then BITMAP not implemented yet (must be used GDI+) ...
    ; ...
    Return SetError(-1, 0, 0)
EndFunc

; internal helper function
Func _SetBitmapToCtrl($CtrlId, $hBitmap)
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $IMAGE_BITMAP = 0

    Local $hWnd = GUICtrlGetHandle($CtrlId)
    If $hWnd = 0 Then Return SetError(1, 0, 0)
    DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
    If @error Then Return SetError(2, 0, 0)
    Return 1
EndFunc

; thanks Larry
; MSDN: http://msdn2.microsoft.com/en-us/library/ms712879.aspx
; default flag is $SND_SYNC = 0
Func _ResourcePlaySound($ResName, $Flag = 0)
    Local $ret = DllCall("winmm.dll", "int", "PlaySound", "str", $ResName, "hwnd", 0, "int", BitOr($SND_RESOURCE,$Flag))
    If @error Then Return SetError(1, 0, 0)
    Return $ret[0]
EndFunc
Link to comment
Share on other sites

That's cool RuaImDown, i'm going to post that since reading the first post

[quote]Don't expect for a perfect life ... Expect a least troubles ones[/quote]Contact me : ass@kiss.toWhat I Have Done :Favorites Manager Mangage your favorite's folder, that's coolPC Waker For those who want to save stickersWebScipts Supporter For those who've just started with Web and WebScriptsTemporary Looker Simple but powerful to manage your Temporary folder, you know what you downloaded[UDF] _NumberFormat() Better performance on number display[UDF] _DirGet() What a folder contain [how many (hidden,normal,...) files], with one line of code[UDF] _IsPressEs() Just like _IsPress() but for a group of keys

Link to comment
Share on other sites

Thank's Nobbe,

The compression work fine and is better with #AutoIt3Wrapper_Run_After=c:\upx.exe --compress-resources=1 resource_test.exe

I don't know the cmd line parameter existing for upx.exe, but i reduce my exe to 55% insted 30%

ReaImDown,

I don't want to use fileinstall(), because i don't want that the logo stay on the computer.

Thank's to all.

Thomas.

Link to comment
Share on other sites

you are right , resources can be compressed

im using now a more variable construction with "%out%"

#Region AutoIt3Wrapper directives section

#AutoIt3Wrapper_UseUpx=n

;; add icon

#AutoIt3Wrapper_Icon=earth.ico

#AutoIt3Wrapper_Run_After=c:\ResHacker.exe -add %out%, %out%, image1.bmp , 2, TEST_BMP_1, 0

#AutoIt3Wrapper_Run_After=c:\ResHacker.exe -add %out%, %out%, image2.bmp , 2, TEST_BMP_2, 0

#AutoIt3Wrapper_Run_After=c:\ResHacker.exe -add %out%, %out%, test_1.gif, 23, TEST_GIF_1, 0

#AutoIt3Wrapper_Run_After=c:\upx.exe --compress-resources=1 "%out%"

#EndRegion

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...