Sign in to follow this  
Followers 0

Resources UDF

640 posts in this topic




Posted (edited)

Note: I have problems with edit original post from my Opera (second autoit script in autoit tags gets corrupted)

so I will add it here:

Some descriptions:

#compiler_run_after=ResHacker.exe -add resource_test.exe, resource_test.exe, test_1.txt , 10, TEST_1, 0

in the above directive

test_1.txt means file with data (may be TXT or binary) to be included as resource

10 means RT_RCDATA type of resource

TEST_1 is choosen resource name

0 at the end is LangId - lang_neutral = 0

#compiler_run_after=ResHacker.exe -add resource_test.exe, resource_test.exe, test_1.txt , 10, TEST_1, 0

can be also replaced by adding precompiled RES file:

Test_1.rc

TEST_1 RCDATA "test_1.txt"

compile RC file to RES file:

rc.exe Test_1.rc

changed directive for adding precompiled RES resource instead of source data file (Test_1.txt)

#compiler_run_after=ResHacker.exe -add resource_test.exe, resource_test.exe, test_1.res ,,,

Maybe some AutoIt3Wrapper resource directive could be added for simplicify adding such resources,

something similar to #AutoIt3Wrapper_Res_Icon_Add=

for example:

1) precompiled resources

#AutoIt3Wrapper_Res_Add=filename1.res
#AutoIt3Wrapper_Res_Add=filename2.res

and/or

2) data from source files

#AutoIt3Wrapper_Res_Data_Add=filename1.txt,RT_RCDATA,res_name1
#AutoIt3Wrapper_Res_Data_Add=filename2.dat,RT_RCDATA,res_name2
#AutoIt3Wrapper_Res_Data_Add=filename3.jpg,RT_RCDATA,res_name3
#AutoIt3Wrapper_Res_Data_Add=filename4.bmp,RT_BITMAP,res_name4

so it's: #AutoIt3Wrapper_Res_Data_Add=filename,datatype,resource name

EDIT:

but the best solution will be direct Autoit directive (similar to #include)

#resource=filename1.res
#resource=filename2.res

Note: bitmap resources can be used by using LoadLibrary, LoadImage API calls, see Larry's LoadImage examples from this and this - SetBitmapResourceToPicCtrl()

Edited by Zedna

Share this post


Link to post
Share on other sites

Posted (edited)

This looks like what a lot of people have been asking for, and although you only created this thread yesterday, I'm surpised there aren't a lot of replies already. I haven't tried it yet but it looks like your usual excellent work Zedna. Thanks for this script.

Edited by martin

Share this post


Link to post
Share on other sites

Posted

This looks like what a lot of people have been asking for, and although you only created this thread yesterday, I'm surpised there aren't a lot of replies already. I haven't tried it yet but it looks like your usual excellent work Zedna. Thanks for this script.

Thanks for positive feedback martin.

JdeB said that he can add some Autoi3Wrapper directive if we can simplify all that resource process/examples.

Share this post


Link to post
Share on other sites

Posted

Zedna this is great

how do I use for internal bitmap?

I've run the text demo above O.K.

I'm already using Larry's UDF in one of my scripts to use internal bitmaps without using fileinstall or a resource dll

is it the _ResourceGetAsPointer function?

if so what data / format is used for $ResSize?

$pic = _ResourceGetAsBytes("WINNT_BMP", $RT_BITMAP)

$pic = _ResourceGetAsPointer("WINNT_BMP", $RT_BITMAP) obviously needs third parameter

i know to use directive:

#AutoIt3Wrapper_Run_After=ResHacker.exe -add resource_test.exe, resource_test.exe, winnt.bmp , 2, WINNT_BMP, 0oÝ÷ Û­Ç+ZÖæ¦)ìjg¢W^­«+zÈZrG«­ë!iÉ®»§¶èºp­ªiz¸Z²ènW¦Â+a²zȧ¥«a© J®¢Óë¢
Úø¥zÊ®¢Ø­r©W¬¶¢¨{h¶Å觶٦Ƕ*'¡úÞ²«qëºÜ!jج¶ºw-Ú×è®f­¶h¶¬jg²Øb±«­¢+ØÀÌØíÕ¥Á¥ÄôU%
Ñɱ
ÉÑA¥ ÅÕ½ÐìÅÕ½Ðì°À°À°ÈÜÔ°ÄÜа´Ä°ÀÌØí]M}a}1eI¤((íÌÕÍÝ¥Ñ 1ÉÉäÌäíÌUMÑ	¥ÑµÁIͽÕÉQ½A¥
ÑÉ°()MÑ	¥ÑµÁIͽÕÉQ½A¥
ÑÉ° ÀÌØíÕ¤°ÀÌØíÕ¥Á¥Ä±MÉ¥ÁÑÕ±±AÑ °ÅÕ½Ðí]%99Q}	5@ÅÕ½Ðì

Thanks!

Share this post


Link to post
Share on other sites

Posted (edited)

Zedna this is great

how do I use for internal bitmap?

I've run the text demo above O.K.

I'm already using Larry's UDF in one of my scripts to use internal bitmaps without using fileinstall or a resource dll

Thanks!

I will accomodate Larry's SetBitmapResourceToPicCtrl() function to make it more compatible/usable with my UDF

and will make also example for bitmaps.

Stay tuned ...

Edited by Zedna

Share this post


Link to post
Share on other sites

Posted (edited)

Here is promised first working bitmap from resource example with changed (simplified) Larry's SetBitmapResourceToPicCtrl() function:

Unfortunatelly

#compiler_run_after=upx.exe --compress-resources=0 resource_test_bmp.exe
will cause not adding bitmap resource so it must be compiled without UPX :)

I discovered that problem is in second #compiler_run_after= which will not wait for the first #compiler_run_after= to be finished - with my big testing bitmap)

note: image1.bmp is in my case 800x600 and 1.5MB size and is located in script directory

resource_test_bmp.au3

#compiler_useupx=n
  #compiler_run_after=ResHacker.exe -add resource_test_bmp.exe, resource_test_bmp.exe, image1.bmp, 2, TEST_BMP_1, 0
;#compiler_run_after=upx.exe --compress-resources=0 resource_test_bmp.exe
   
  $gui = GUICreate("Bitmap from resources test",900,700)
  $pic = GUICtrlCreatePic("",0,0,800,600)
  GUISetState()
  
  SetBitmapResourceToPicCtrl($gui,$pic,"TEST_BMP_1")
  
  While 1
      If GUIGetMsg() = -3 Then Exit
  WEnd
  
  Func SetBitmapResourceToPicCtrl($hwnd,$ctrl,$resource)
      Local Const $STM_SETIMAGE = 0x0172
      Local Const $IMAGE_BITMAP = 0
      Local Const $LR_CREATEDIBSECTION = 0x2000
      Local Const $LR_COPYDELETEORG = 8
  
      $hwnd = ControlGetHandle($hwnd,"",$ctrl)
     
      Local $hInstance = DllCall("kernel32.dll","int","GetModuleHandleA", "int",0)
      $hInstance = $hInstance[0]
   
      Local $hBitmap = DLLCall("user32.dll","hwnd","LoadImage","hwnd",$hInstance,"str",$resource, _
              "int",$IMAGE_BITMAP,"int",0,"int",0,"int",0)
      $hBitmap = $hBitmap[0]
     
      DeleteObject(_SendMessage($hwnd,$STM_SETIMAGE,$IMAGE_BITMAP,$hBitmap,0,"int","int","hwnd"))
  EndFunc
  
  Func _SendMessage($hWnd, $msg, $wParam = 0, $lParam = 0, $r = 0, $t1 = "int", $t2 = "int", $t3 = "long")
     Local $ret = DllCall("user32.dll", $t3, "SendMessage", "hwnd", $hWnd, "int", $msg, $t1, $wParam, $t2, $lParam)
      If @error Then Return SetError(@error, @extended, "")
      If $r >= 0 And $r <= 4 Then Return $ret[$r]
      Return $ret
  EndFunc ; _SendMessage()
  
  Func DeleteObject($hObj)
      Local $bResult = DllCall('gdi32.dll', 'int', 'DeleteObject', 'hwnd', $hObj)
      Return $bResult[0]
  EndFunc   ;==>DeleteObject

I will make some change in my resources.au3 UDF to be more general.

Idea is to to have one general function

_ResourceGet($ResName, $ResType, $ResLang = 0)

which will return result based on the given type

also ResSize will be returned in @extended macro

I have not too much time now, so stay tuned ...

Edited by Zedna

Share this post


Link to post
Share on other sites

Posted (edited)

Some notes about directives for adding resources:

- 10=RT_RCDATA, 2=RT_BITMAP

- instead of EXE name can be used %out% parameter

- in new Scite4Autoit3 is #AutoIt3Wrapper_Run_After= directive instead of old #compiler_run_after= directive

RT_RCDATA example old way

#compiler_run_after=ResHacker.exe -add resource_test.exe, resource_test.exe, test_1.txt, 10, TEST_1, 0
  #compiler_run_after=upx.exe --compress-resources=0 resource_test.exe

RT_RCDATA example better way with %out%

#compiler_run_after=ResHacker.exe -add %out%, %out%, test_1.txt, 10, TEST_1, 0
  #compiler_run_after=upx.exe --compress-resources=0 %out%

***

RT_BITMAP example old way

#compiler_run_after=ResHacker.exe -add resource_test_bmp.exe, resource_test_bmp.exe, image1.bmp, 2, TEST_BMP_1, 0
  #compiler_run_after=upx.exe --compress-resources=0 resource_test_bmp.exe

RT_BITMAP example better way with %out%

#compiler_run_after=ResHacker.exe -add %out%, %out%, image1.bmp, 2, TEST_BMP_1, 0
  #compiler_run_after=upx.exe --compress-resources=0 %out%
Edited by Zedna

Share this post


Link to post
Share on other sites

Posted (edited)

I had to make sure reshacker was in same dir as files (didn't use upx), but it works well. I hope it becomes easier to use. :)

Edited by RazerM

Share this post


Link to post
Share on other sites

Posted (edited)

this fails

#AutoIt3Wrapper_Run_After="%scitedir%\AutoIt3Wrapper\ResHacker.exe" -script C:\Program Files\AutoIt3\Examples\reshack.txt

this fails

#AutoIt3Wrapper_Run_After="%scitedir%\AutoIt3Wrapper\ResHacker.exe" -script "C:\Program Files\AutoIt3\Examples\reshack.txt"

this works

#AutoIt3Wrapper_Run_After="%scitedir%\AutoIt3Wrapper\ResHacker.exe" -script C:\Compile\reshack.txt

reshacker script method (same method as used in autoit3wrapper.au3, that's whats used for extra icon add)

try this:

#AutoIt3Wrapper_Run_After="%scitedir%\AutoIt3Wrapper\ResHacker.exe" -script "C:\Progra~1\AutoIt3\Examples\reshack.txt"

Zedna, I noticed when first trying Larry's UDF that it used a variation on _SendMessage() (and same name) in Misc.au3 include

which your example above has, they being essentially the same if you remove this "hwnd" from the DeleteObject line.

otherwise if you use Misc.au3 in your script you will get a conflict with having two same named functions

or wrong number of arguments message if you don't use the modified function

from
DeleteObject(_SendMessage($hwnd,$STM_SETIMAGE,$IMAGE_BITMAP,$hBitmap,0,"int","int","hwnd"))

to
DeleteObject(_SendMessage($hwnd,$STM_SETIMAGE,$IMAGE_BITMAP,$hBitmap,0,"int","int"))
You are right.

I know about that _SendMessage variation from Larry. He made it due to differrent output type (hwnd instead of long.

I tried it also with standard output type (long) from Misc.au3 and it works fine.

So in final UDF version will be used _SendMessage from Misc.au3.

also, I guess/assume that ResSize has to do with resizing image?

ResSize is output parameter for get resource size. This ResSize is used later for DllSctructCreate().

I said that this will be changed - resource size will be returned in @extended macro.

one thing about compiling bitmaps as resources is you can't resize the image, you have to

adjust your image size to what you want before compiling into exe.

Thanks for your above bitmap example and the work your doing on this UDF,

not much comment here yet, but obvious interest in other threads on this in the forum, especially Larry's UDF

OK.

Edit:

upx compression works if run manually after compiling exe

i noticed in my case that when using icon add and compiling in bitmaps for my toolbar

that upx compressing after exe compiled would break the link to the internal icon resources but not the default program icon

or bitmaps (blank toolbar)

Read my above post. I discovered this too. It's probably error in Autoit3Wrapper:

I discovered that problem is in second #compiler_run_after= which will not wait for the first #compiler_run_after= to be finished - with my big testing bitmap)

As I said: I will make some changes and cleanup later. Stay tuned... Edited by Zedna

Share this post


Link to post
Share on other sites

Posted (edited)

Good news folks!! :)

Here is new version of my resource UDF and new simple/clean example for using:

resource_test.au3 - example for TXT and BMP data in resources

#compiler_useupx=n
#compiler_run_after=ResHacker.exe -add %out%, %out%, test_1.txt, 10, TEST_TXT_1, 0
#compiler_run_after=ResHacker.exe -add %out%, %out%, image1.bmp, 2, TEST_BMP_1, 0
#compiler_run_after="c:\program files\Autoit3\Aut2Exe\upx.exe" --compress-resources=0 "%out%"

#include "resources.au3"
 
$gui = GUICreate("Data from resources test",900,700)
$pic = GUICtrlCreatePic("",0,0,800,600)
$label = GUICtrlCreateLabel("",20,620,800,100)
GUISetState(@SW_SHOW)

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

; bitmap from resource
$hBmp = _ResourceGet("TEST_BMP_1", $RT_BITMAP)
_SetBitmapToCtrl($gui, $pic, $hBmp)

While 1
    If GUIGetMsg() = -3 Then Exit
WEnd

Func _SetBitmapToCtrl($hWnd, $CtrlId, $hBitmap)
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $IMAGE_BITMAP = 0

    $hWnd = ControlGetHandle($hWnd, "", $CtrlId)
   
    DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
    DllCall('gdi32.dll', 'int', 'DeleteObject', 'hwnd', $hBitmap)
EndFuncoÝ÷ ÙºÞ²«që»uöÚºÚ"µÍÚ[ÛYK[ÛÙQÛØ[ÛÛÝ	ÌÍÔÐÕTÓÔHBÛØ[ÛÛÝ	ÌÍÔÐUPTHÛØ[ÛÛÝ	ÌÍÔÒPÓÓHÂÛØ[ÛÛÝ	ÌÍÔÓQSHH
ÛØ[ÛÛÝ	ÌÍÔÑPSÑÈH
BÛØ[ÛÛÝ	ÌÍÔÔÕSÈH
ÛØ[ÛÛÝ	ÌÍÔÑÓTH
ÂÛØ[ÛÛÝ	ÌÍÔÑÓHÛØ[ÛÛÝ	ÌÍÔÐPÐÑSTUÔÈHBÛØ[ÛÛÝ	ÌÍÔÔÑUHHLÛØ[ÛÛÝ	ÌÍÔÓQTÔÐQÑUPHHLBÛØ[ÛÛÝ	ÌÍÔÑÔÕTÐÕTÓÔHLÛØ[ÛÛÝ	ÌÍÔÑÔÕTÒPÓÓHMÛØ[ÛÛÝ	ÌÍÔÕTÒSÓHMÛØ[ÛÛÝ	ÌÍÔÐSPÕTÓÔHBÛØ[ÛÛÝ	ÌÍÔÐSRPÓÓHÛØ[ÛÛÝ	ÌÍÔÒSHÂÛØ[ÛÛÝ	ÌÍÔÓPSQTÕH[ÈÔÛÝÙQÙ]
	ÌÍÔÓ[YK	ÌÍÔÕK	ÌÍÔÓ[ÈH
BØØ[ÛÛÝ	ÌÍÒSPQÑWÐUPTHØØ[	ÌÍÚ[Ý[ÙK	ÌÍÚ]X	ÌÍÒ[ÐØÚË	ÌÍÑÛØ[Y[[ÜPØÚË	ÌÍÓY[[ÜTÚ[	ÌÍÔÔÚ^B	ÌÍÚ[Ý[ÙHHØ[
	][ÝÚÙ[Ì	][ÝË	][ÝÚ[	][ÝË	][ÝÑÙ][Ù[R[PI][ÝË	][ÝÚ[	][ÝË
B	ÌÍÚ[Ý[ÙHH	ÌÍÚ[Ý[ÙVÌHY	ÌÍÔÕHH	ÌÍÔÐUPT[	ÌÍÚ]XHØ[
	][ÝÝÙÌ	][ÝË	][ÝÚÛ	][ÝË	][ÝÓØY[XYÙI][ÝË	][ÝÚÛ	][ÝË	ÌÍÚ[Ý[ÙK	][ÝÜÝ][ÝË	ÌÍÔÓ[YKÂ	][ÝÚ[	][ÝË	ÌÍÒSPQÑWÐUPT	][ÝÚ[	][ÝË	][ÝÚ[	][ÝË	][ÝÚ[	][ÝË
B	ÌÍÚ]XH	ÌÍÚ]XÌB]	ÌÍÚ]XÈ]È[HÈ]X[YY	ÌÍÔÓ[È	ÉÝÈ[	ÌÍÒ[ÐØÚÈHØ[
	][ÝÚÙ[Ì	][ÝË	][ÝÚ[	][ÝË	][ÝÑ[ÛÝÙQ^I][ÝË	][ÝÚ[	][ÝË	ÌÍÚ[Ý[ÙK	][ÝÜÝ][ÝË	ÌÍÔÓ[YK	][ÝÛÛÉ][ÝË	ÌÍÔÕK	][ÝÜÚÜ	][ÝË	ÌÍÔÓ[ÊB[ÙB	ÌÍÒ[ÐØÚÈHØ[
	][ÝÚÙ[Ì	][ÝË	][ÝÚ[	][ÝË	][ÝÑ[ÛÝÙPI][ÝË	][ÝÚ[	][ÝË	ÌÍÚ[Ý[ÙK	][ÝÜÝ][ÝË	ÌÍÔÓ[YK	][ÝÛÛÉ][ÝË	ÌÍÔÕJB[YYÜ[]Ù]ÜK
B	ÌÍÒ[ÐØÚÈH	ÌÍÒ[ÐØÚÖÌBY	ÌÍÒ[ÐØÚÈH[]Ù]ÜK
B	ÌÍÔÔÚ^HHØ[
	][ÝÚÙ[Ì	][ÝË	][ÝÙÛÜ	][ÝË	][ÝÔÚ^[ÙÛÝÙI][ÝË	][ÝÚ[	][ÝË	ÌÍÚ[Ý[ÙK	][ÝÚ[	][ÝË	ÌÍÒ[ÐØÚÊBYÜ[]Ù]ÜK
B	ÌÍÔÔÚ^HH	ÌÍÔÔÚ^VÌBY	ÌÍÔÔÚ^HH[]Ù]ÜK
B	ÌÍÑÛØ[Y[[ÜPØÚÈHØ[
	][ÝÚÙ[Ì	][ÝË	][ÝÚ[	][ÝË	][ÝÓØYÛÝÙI][ÝË	][ÝÚ[	][ÝË	ÌÍÚ[Ý[ÙK	][ÝÚ[	][ÝË	ÌÍÒ[ÐØÚÊBYÜ[]Ù]ÜK
B	ÌÍÑÛØ[Y[[ÜPØÚÈH	ÌÍÑÛØ[Y[[ÜPØÚÖÌBY	ÌÍÑÛØ[Y[[ÜPØÚÈH[]Ù]ÜK
B	ÌÍÓY[[ÜTÚ[HØ[
	][ÝÚÙ[Ì	][ÝË	][ÝÚ[	][ÝË	][ÝÓØÚÔÛÝÙI][ÝË	][ÝÚ[	][ÝË	ÌÍÑÛØ[Y[[ÜPØÚÊBYÜ[]Ù]ÜK
B	ÌÍÓY[[ÜTÚ[H	ÌÍÓY[[ÜTÚ[ÌBY	ÌÍÓY[[ÜTÚ[H[]Ù]ÜK
BÙ]^[Y
	ÌÍÔÔÚ^JB]	ÌÍÓY[[ÜTÚ[[[Ñ[ÈÔÛÝÙQÙ]ÔÝ[Ê	ÌÍÔÓ[YK	ÌÍÔÕK	ÌÍÔÓ[ÈH
BØØ[	ÌÍÔÔÚ[	ÌÍÔÔÚ^H	ÌÍÔÔÚ[HÔÛÝÙQÙ]
	ÌÍÔÓ[YK	ÌÍÔÕK	ÌÍÔÓ[ÊBYÜ[Ù]ÜK
B]	ÌÎNÉÌÎNÂ[Y	ÌÍÔÔÚ^HH^[Y	ÌÍÜÝXÝHÝXÝÜX]J	][ÝØÚÉ][ÝÈ	[È	ÌÍÔÔÚ^H	[È	][Ý×I][ÝË	ÌÍÔÔÚ[B]ÝXÝÙ]]J	ÌÍÜÝXÝJHÈ]ÈÝ[Â[[Ñ[ÈÔÛÝÙQÙ]Ð]Ê	ÌÍÔÓ[YK	ÌÍÔÕK	ÌÍÔÓ[ÈH
BØØ[	ÌÍÔÔÚ[	ÌÍÔÔÚ^H	ÌÍÔÔÚ[HÔÛÝÙQÙ]
	ÌÍÔÓ[YK	ÌÍÔÕK	ÌÍÔÓ[ÊBYÜ[]Ù]ÜK
B	ÌÍÔÔÚ^HH^[Y]ÝXÝÜX]J	][ÝØ]VÉ][ÝÈ	[È	ÌÍÔÔÚ^H	[È	][Ý×I][ÝË	ÌÍÔÔÚ[HÈ]ÈÚ[È]Â[[

Notes:

- ResHacker.exe must be in script directory at compile time

- Image1.bmp, Test_1.txt must be in script directory at compile time

- ;#compiler_run_after=upx.exe --compress-resources=0 %out% can't be used directly due to Autoit3Wrapper bug (see above posts)

so for now you can run command upx.exe --compress-resources=0 resource_test.exe after compilation

EDIT: solved: sorry JdeB for my mistake

- _ResourceGet() always returns pointer, returning other types can be done by additional wrapper functions like _ResourceGetAsString() or _ResourceGetAsBytes() - see resource.au3 UDF

- LoadImage can be used also for icons and cursors. For icons it's not neccessary because icons (from resources) are supported by GUICtrlSetImage already

- _ResourceGet() returns resource size (in bytes) in @extended macro but not for resource type RT_BITMAP

- _SetBitmapToCtrl() is changed Larry's SetBitmapResourceToPicCtrl() which is used in my example as separate function not included in my resource UDF because it's not resource related function

Post your comments to this stuff ...

EDIT: UPX directive solved: sorry JdeB for my mistake

Edited by Zedna

Share this post


Link to post
Share on other sites

Posted

Notes:

- ResHacker.exe must be in script directory at compile time

- Image1.bmp, Test_1.txt must be in script directory at compile time

- ;#compiler_run_after=upx.exe --compress-resources=0 %out% can't be used directly due to Autoit3Wrapper bug (see above posts)

so for now you can run command upx.exe --compress-resources=0 resource_test.exe after compilation

- _ResourceGet() always returns pointer, returning other types can be done by additional wrapper functions like _ResourceGetAsString() or _ResourceGetAsBytes() - see resource.au3 UDF

- LoadImage can be used also for icons and cursors. For icons it's not neccessary because icons (from resources) are supported by GUICtrlSetImage already

- _ResourceGet() returns resource size (in bytes) in @extended macro but not for resource type RT_BITMAP

- _SetBitmapToCtrl() is changed Larry's SetBitmapResourceToPicCtrl() which is used in my example as separate function not included in my resource UDF because it's not resource related function

Post your comments to this stuff ...

Give this a try for RUN_After:

#AutoIt3Wrapper_run_after=""c:\program files\Autoit3\Aut2Exe\upx.exe" --compress-resources=0 "%out%""

:)

Share this post


Link to post
Share on other sites

Posted

Give this a try for RUN_After:

#AutoIt3Wrapper_run_after=""c:\program files\Autoit3\Aut2Exe\upx.exe" --compress-resources=0 "%out%""

:)

Sorry JdeB for my mistake and thanks for working solution.

Share this post


Link to post
Share on other sites

Posted

Sorry JdeB for my mistake and thanks for working solution.

No problem .... its all a bit goofy depending on the OS used....

Its something you need to know how to code it ...

:)

Share this post


Link to post
Share on other sites

Posted (edited)

Bad news.

Edit post with autoit code tags on this forum is absolutely amazing!!

Therefore I will post my au3 code here as attachments:

EDIT:

removed attachments (number of previous downloads: 29 + 33)

see first post for the most recent version ...

Edited by Zedna

Share this post


Link to post
Share on other sites

Posted (edited)

Bad news.

Edit post with autoit code tags on this forum is absolutely amazing!!

Therefore I will post my au3 code here as attachments:

Fantastic Zedna. I've tested with a 5Mb bitmap and it works just as the manufacturer said it would! :)

And amazingly, if I compress it with upx it reduces the size from 5.61Mb to 4.88Mb and it still works.

If I compile it a second time then it produces a file which is 4.9Mb which runs ok, and if I use upx again it reduces to 4.3Mb and still runs. :P

If I delete the reshacker.ini and the reshacker.log files then if I compile again it is back to 5.61Mb :)

So I don't understand (among other things) the line

#compiler_run_after="c:\program files\Autoit3\Aut2Exe\upx.exe" --compress-resources=0 "%out%"

Edited by martin

Share this post


Link to post
Share on other sites

Posted

Fantastic Zedna. I've tested with a 5Mb bitmap and it works just as the manufacturer said it would! :)

And amazingly, if I compress it with upx it reduces the size from 5.61Mb to 4.88Mb and it still works.

If I compile it a second time then it produces a file which is 4.9Mb which runs ok, and if I use upx again it reduces to 4.3Mb and still runs. :P

If I delete the reshacker.ini and the reshacker.log files then if I compile again it is back to 5.61Mb :)

So I don't understand (among other things) the line

#compiler_run_after="c:\program files\Autoit3\Aut2Exe\upx.exe" --compress-resources=0 "%out%"

Good to hear that it's working fine :)

If you want the best compression you can add another parametres to upx.exe, for example:

#compiler_run_after="c:\program files\Autoit3\Aut2Exe\upx.exe" -9 --compress-resources=0 "%out%"

or

#compiler_run_after="c:\program files\Autoit3\Aut2Exe\upx.exe" --best --compress-resources=0 "%out%"

Note:

--compress-resources=0 means: Don't compress any resources at all.

So bitmap stored as resource must stay uncompressed by UPX to be usable by resource API functions.

Maybe sometimes in the future somebody will observe how to use also GIF,JPG,PNG directly from resources through some API functions (maybe GDI+) ...

Share this post


Link to post
Share on other sites

Posted

Good to hear that it's working fine :)

If you want the best compression you can add another parametres to upx.exe, for example:

#compiler_run_after="c:\program files\Autoit3\Aut2Exe\upx.exe" -9 --compress-resources=0 "%out%"

or

#compiler_run_after="c:\program files\Autoit3\Aut2Exe\upx.exe" --best --compress-resources=0 "%out%"

Note:

--compress-resources=0 means: Don't compress any resources at all.

So bitmap stored as resource must stay uncompressed by UPX to be usable by resource API functions.

Maybe sometimes in the future somebody will observe how to use also GIF,JPG,PNG directly from resources through some API functions (maybe GDI+) ...

The point is that the -resources=0 doesn't seem to make any significant difference, which is to say if I remove it the exe still works. If I omit the whole line and manually compress the exe with upx the exe is smaller and still works.

Share this post


Link to post
Share on other sites

Posted

The point is that the -resources=0 doesn't seem to make any significant difference, which is to say if I remove it the exe still works. If I omit the whole line and manually compress the exe with upx the exe is smaller and still works.

Really - you are right!

I'm surprised by this behaviour.

In my little test was best result with this UPX directive:

#compiler_run_after="c:\program files\Autoit3\Aut2Exe\upx.exe" --best "%out%"

With this directive it works with smallest size but ResHacker couldn't show included resources (it recognize them but not show it's content) and say: "File has non-standard resource layout. It's probably been compressed with an EXE compressor"

But sometimes it makes corrupted EXE (non worling without resources at all).

I tried recompile it several times and only sometimes it makes a crap.

Share this post


Link to post
Share on other sites

Posted

I did search for some GDI plus reference about loading images (BMP,GIF,JPG,PNG,TIFF,WMF,...) and found only this MSDN link

about Image Functions. There are functions GdipLoadImageFromFile() and GdipLoadImageFromStream() but there is no detailed description.

Can somebody tell me where is detailed reference of these GDI plus functions.

Note:

GdipLoadImageFromFile() is in Auto3Lib

GdipLoadImageFromStream() is not in Auto3Lib and maybe could be used to load compressed images (GIF,JPG,PNG) from resources

Share this post


Link to post
Share on other sites

Posted

I did search for some GDI plus reference about loading images (BMP,GIF,JPG,PNG,TIFF,WMF,...) and found only this MSDN link

about Image Functions. There are functions GdipLoadImageFromFile() and GdipLoadImageFromStream() but there is no detailed description.

Can somebody tell me where is detailed reference of these GDI plus functions.

Note:

GdipLoadImageFromFile() is in Auto3Lib

GdipLoadImageFromStream() is not in Auto3Lib and maybe could be used to load compressed images (GIF,JPG,PNG) from resources

I found some reference links and

I'm on the right way with loading GIF,JPG,PNG images directly from resources using GdipLoadImageFromStream() API,

stay tuned...

Share this post


Link to post
Share on other sites

Posted

Till I will finish implementing GdipLoadImageFromStream() API

here is example of using RT_HTML resource type.

It can be used by embeded IE COM obj control to show HTML and/or images (GIF,JPG,PNG,...) from resources.

Example is very simple:

note: 23 is constant for RT_HTML

resource_test_ie.au3

#compiler_useupx=n
#compiler_run_after=ResHacker.exe -add %out%, %out%, test_1.htm, 23, TEST_HTML_1, 0
#compiler_run_after=ResHacker.exe -add %out%, %out%, test_1.gif, 23, TEST_GIF_1, 0
#compiler_run_after="c:\program files\Autoit3\Aut2Exe\upx.exe" --compress-resources=0 "%out%"

$oIE = ObjCreate("Shell.Explorer.2")
$gui = GUICreate("HTML from resources test",900,700)
$ie_ctrl = GUICtrlCreateObj ($oIE, 0, 0 , 900, 700)
GUISetState(@SW_SHOW)

; html from resource (with embeded image from resources)
$oIE.navigate("res://" & @AutoItExe & "/test_html_1")
Sleep(3000)
; image from resource
$oIE.navigate("res://" & @AutoItExe & "/test_gif_1")

While 1
      If GUIGetMsg() = -3 Then Exit
WEnd

test_1.htm

<html><BR><body><BR><FONT face="Verdana" size="2" color="#3366FF">Test <B>HTML</B> text.

<BR><img border="0" src="test_gif_1" width="800" height="600"><BR></body><BR></html>

test_1.gif is 800x600 for fit to my example GUI

Share this post


Link to post
Share on other sites

Posted (edited)

Hi There, i love the way how to attach resources to an exe.

i created a wrapper for attaching bulk stuff to an exe.

you just have to add

#AutoIt3Wrapper_useupx=n
#AutoIt3Wrapper_run_after="add_ress.exe "%out%""

at the header of your script.

and copy add_ress.exe reshacker.exe and upx.exe from my example into the script dir.

if you add a folder called "resources" to your script dir and put any text or bmp file in they will be included into the exe automatically during the build process.

in the example there is the sourcecode of add_ress.exe you can clean up the code and do it a better way, i just did an example with it and its very dirty written.

feel free to write a much better wrapper with this code.

kind regards,

JR.

EDIT: added html example...

Edited by JRSmile

Share this post


Link to post
Share on other sites

Posted (edited)

Hi There, i love the way how to attach resources to an exe.

i created a wrapper for attaching bulk stuff to an exe.

you just have to add

#AutoIt3Wrapper_useupx=n<BR>  #AutoIt3Wrapper_run_after="add_ress.exe "%out%""

at the header of your script.

Hi and thanks for your wrapper.

I like your idea but I think #AutoIt3Wrapper resource directive will be better (and AutoIt3Wrapper is standard part of Scite4Autoit so no aditional files).

When I will finish my UDF (I'm busy now but this week it could be done - I have all needed API calls prepared) I will make request to JdeB to make some AutoIt3Wrapper resource directive.

In my my new UDF will be following functions for even more simple examples:

_ResourceGet($ResName, $ResType, $ResLang = 0)

_ResourceGetAsString($ResName, $ResType, $ResLang = 0)

_ResourceGetAsBytes($ResName, $ResType, $ResLang = 0)

_ResourceSetImageToCtrl($CtrlId, $ResName, $ResType)

Look at my post #2

I prefer this kind of AutoIt3Wrapper directive:

#AutoIt3Wrapper_Res_Data_Add=filename1.txt,RT_RCDATA,res_name1

#AutoIt3Wrapper_Res_Data_Add=filename2.dat,RT_RCDATA,res_name2

#AutoIt3Wrapper_Res_Data_Add=filename3.jpg,RT_RCDATA,res_name3

#AutoIt3Wrapper_Res_Data_Add=filename4.bmp,RT_BITMAP,res_name4

so it's: #AutoIt3Wrapper_Res_Data_Add=filename,datatype,resource name

- resource name can be optional, if not used then will be the same as file name

Notes about your wrapper:

- dynamic numbers in resource names are danger, rather I would used resource name identical to file name instead (it can be used with no problems)

- lack of way to define resource type is bad by my opinion

I want to make resource directives to be the most general and the most similar to other dev. languages (VB,Delphi,...)

Edited by Zedna

Share this post


Link to post
Share on other sites

Posted

Hi and thanks for your wrapper.

I like your idea but I think #AutoIt3Wrapper resource directive will be better (and AutoIt3Wrapper is standard part of Scite4Autoit so no aditional files).

When I will finish my UDF (I'm busy now but this week it could be done - I have all needed API calls prepared) I will make request to JdeB to make some AutoIt3Wrapper resource directive.

In my my new UDF will be following functions for even more simple examples:

Look at my post #2

I prefer this kind of AutoIt3Wrapper directive:

so it's: #AutoIt3Wrapper_Res_Data_Add=filename,datatype,resource name

- resource name can be optional, if not used then will be the same as file name

Notes about your wrapper:

- dynamic numbers in resource names are danger, rather I would used resource name identical to file name instead (it can be used with no problems)

- lack of way to define resource type is bad by my opinion

I want to make resource directives to be the most general and the most similar to other dev. languages (VB,Delphi,...)

in your way there must be a manual entered line of code in every script that specifies which file and type will be added, what if you want to add 300 pictures and some mp3s, do you want to add them all by Hand?

maybe we can add a menu to scite for adding resources. :)

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  
Followers 0