Jump to content
Sign in to follow this  
NDTC

Embedded picture in compiled File

Recommended Posts

NDTC

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.

Share this post


Link to post
Share on other sites
nobbe

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

Share this post


Link to post
Share on other sites
NDTC

It's work find...

But the compression is disable... The size of my EXE file from 300k to 650k while my picture is 30k!

Thank you...

Share this post


Link to post
Share on other sites
nobbe

use this AFTER the embedding

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

c:\upx.exe -> path to upx..

Share this post


Link to post
Share on other sites
nobbe

if recources are compressed i think i wont work anymore

Share this post


Link to post
Share on other sites
ReaImDown

if recources are compressed i think i wont work anymore

cant you just use fileinstall()?


[u][font="Century Gothic"]~я α и d γ ĵ . ċ . ѕ қ ϊ и и ε я~- My Programs -auto shutdownSleep funcdisallow programs[/font][/u]

Share this post


Link to post
Share on other sites
d4rk

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

Share this post


Link to post
Share on other sites
NDTC

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.

Share this post


Link to post
Share on other sites
nobbe

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

Share this post


Link to post
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
Sign in to follow this  

×