Jump to content

Want to start recompile without using separate .exe and one other question...

Recommended Posts

So I was looking at the self delete FAQ code and was wondering if there is a way for me to modify that to do a self compile.

Basically, I want to be able to take my .exe, run it, have it unpack and change whatever files need changing, then recompile everything back into itself. I considered making a separate .exe so I could auto re-run the main.exe afterwards using a switch ,and I was also thinking I could make a placeholder file so the program would know it was just updated and run anything specific afterwards if I didn't make a separate .exe

MsgBox(0,"Start","Starting self-compile attempt.")
    $iDelay = 0
    Local $sCmdFile
    FileDelete(@TempDir & "update.bat")
    $sCmdFile = 'ping -n ' & $iDelay & ' > nul' & @CRLF _
             & ':loop' & @CRLF _
             & @ScriptDir & 'UpdatesAut2exe.exe /in test.au3 /icon test.ico' & @CRLF _
             & 'if exist "' & @ScriptDir & 'Updatestest.au3 goto loop' & @CRLF _
             & 'Pause'
    FileWrite(@TempDir & "update.bat", $sCmdFile)
    Run(@TempDir & "update.bat", @TempDir, @SW_SHOW)

Also, if I make an includes file, to list all of the files that would need including, would that be relative to that file, i.e

This code would run the file from the main.exe being in the highest parent folder (like C: for example)


But in my subfolder: (example C:UpdateFileInstall.au3 and C:Updateextra_filesfile.exe)

FileInstall("extra_filesfile.exe", "file.exe")

If I was to #include that file into my main.exe, would it be placed in the right folder? I'm gonna test that theory in a bit, and post my findings. The basic thing is that if I was to re-compile the script, since that has to be a literal string, would prefer to not have to do a bunch of checking for those files to be in the right place lol.

As I'm running this through my head, I'm realizing that one option would be to compile that into the other .exe (update.exe) and then just have an extract all switch like /e.

Basic breakdown as I see it in my head: have the main.exe compile FileInstalling only the compiler and the update.exe files. The main.exe file would then extract the update.exe file and by default it would extract all files needed for running the sub programs. When going to update I would pass a switch /u to it so it would update any files, then recompile the main.exe. This is where the my need to possibly pass the command via the loopback into the computer would be needed. My testing shows that when going to run the compiler I need more time between the time I pass the command and the time it starts compiling due to it trying to pack the update.exe file and causing the compile to fail. One option I thought of was to do:


but someone else didn't like it because they was thinking it would double the size of the file. I'm gonna test that theory in a minute as well after I finish making my final edit xD

Ok sorry for the massive post but this is a unique to me concept and was wondering if anyone else found this idea interesting and also had any advice.

Edited by hackersarchangel
Link to post
Share on other sites

Ok so I did a test with the option:


and it did not double the size of the file. I used a 4mb file to test with, going to include a bigger file and see if it's any different. Also noticed that FileInstall put the files in the same Dir as the Update.exe unless I specified the subdirectory. Since running commands needs to be spot on, just have to remember to specify that :) Doesn't change anything though.

Link to post
Share on other sites

Why would you do this? Although I think it's an interesting idea, I don't see any advantage to it. On the other hand I can think of several drawbacks. What is wrong with simply writing commands to an external file such as an ini file?

Edited by czardas
Link to post
Share on other sites

What I'm gonna do is compile two .exe's. One that has all the files in it and the commands for recompiling the main .exe. Then I will pack that exe inside the main exe, and when running, unpack the update.exe and then send it a switch to tell it what mode to go into, either to self update, or to just pop out all the files that are needed with the main.exe

Some of the other stuff I was just thinking could be useful, I did notice yesterday on the self delete one that when I had it do that it didn't take long to loopback into the machine except in one instance of that where it took it a full 5 seconds to do that

Oh and the advantage is that with the way I'm designing the program is that we have some files that hardly ever update, but others that update more often, almost daily, so I'm going to pack the least updated files into the .exe but in the event we encounter an old file that needs replacing from our program, we want to replace that file, then rebuild itself on the fly. Sounds complicated I know, but we want a program that can self maintain and still as much as we can when in transport, not run time, stay as one .exe

Edited by hackersarchangel
Link to post
Share on other sites

Mmm, I still don't see any real clear described purpose (Describing how it should work don't count to me as purpuse.).. Only thing I can think of is the bad kind's. ... Posters name not helping in that respect. ...

"Straight_and_Crooked_Thinking" : A "classic guide to ferreting out untruths, half-truths, and other distortions of facts in political and social discussions."
"The Secrets of Quantum Physics" : New and excellent 2 part documentary on Quantum Physics by Jim Al-Khalili. (Dec 2014)

"Believing what you know ain't so" ...

Knock Knock ...

Link to post
Share on other sites
  • Moderators


as much as we can when in transport, not run time, stay as one .exe

This bit is easy. I have written a script which FileInstalls several files within itself (an exe and various graphic and data files). When the compiled script is run these files are extracted to a folder and the stored exe run with a switch set by the parent, using the other files as needed. When the extracted exe finishes, the parent deletes all the extracted files and waits until the next run. :)

I can see how this could be amended to get the original file to recompile itself with updated internal files, but I really see little advantage over simply replacing the entire file. The "creation" process is rather fiddly requiring the writing of a "compiler" script with a lot of multiple quotes in the strings (always a syntactic nightmare :D) and also needing Aut2Exe.exe and AutoItSC.bin to be FileInstalled - which makes for a pretty hefty exe once everthing is onboard. ;)

In my opinion your idea is not without merit, but is unrealistic in practice. In these days of fast broadband download speeds simply replacing the whole exe seems to me to be the better solution. :)


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:


ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area


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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By red0fireus
      When I run my script without compiling it, it works just fine.
      When I compile the script and run it this part of the script doesn't run properly. Here's my terrible explanation of what's supposed to happen but doesn't once its compiled.
      I have part of the script call the Function _Update well once it calls _Update it runs ShellExecute("C:\Test\test\run\Email.au3") immediately and doesn't wait 5 minutes. 
      $iMinutes = 5 $hTimer = TimerInit() Func _Update() AdlibRegister(_Update, 2000) If TimerDiff($hTimer) > ($iMinutes * 60000) And ProcessExists($recheck) Then ;ConsoleWrite("5 minutes have passed!" & @CRLF) ShellExecute("C:\Test\test\run\Email.au3") AdlibUnRegister(_Update) $hTimer = TimerInit() ElseIf Not ProcessExists($recheck) Then AdlibUnRegister(_Update) EndIf EndFunc Anyone have any suggestions on what I can do to fix this?
    • By ModemJunki
      I have an issue with compiling a file from inside a script using
      The script is kind of long so I will try to paraphrase what is happening.
      First, I get the compiler locations and store them in variables:
      Global $compileExe86 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Aut2Exe.exe", "") Global $compileExe64 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Aut2Exe_x64.exe", "") Then later I parse an array within a function to compile a list of files one at a time. The function accepts "x86" for files to be compiles as x86 and "x64" for 64-bit compiling.
      If $s_arch = "x86" Then $s_action = "/in " & @ScriptDir & "\" & $a_CompileFiles[$i][0] & " /out " & @ScriptDir & "\" & $a_CompileFiles[$i][1] & "\" & StringReplace($a_CompileFiles[$i][0], ".au3", ".exe") & " /pack /comp 4 /icon " & $icon ; x86 ElseIf $s_arch = "x64" Then $s_action = "/in " & @ScriptDir & "\" & $a_CompileFiles[$i][0] & " /out " & @ScriptDir & "\" & $a_CompileFiles[$i][1] & "\" & StringReplace($a_CompileFiles[$i][0], ".au3", ".exe") & " /pack /comp 4 /icon " & $icon & " /x64" ; x64 EndIf $s_err = ShellExecuteWait($compileExe, $s_action, @ScriptDir, $SHEX_OPEN, @SW_HIDE) The problem is that $s_err will return 0 if the file is compiled successfully or not - for example, if one of the files uses FileInstall() but the file to be installed is not present, I still get a return of 0, but if I compile the same file from the command line I get a return of 3 as the errorlevel.
      This happens even though Aut2Exe is popping up an error dialog that has to be confirmed.
      I also tried with RunWait and got the same result.
      Is this a known issue?
    • By LFCavalcanti
      Backstory to understand my need:
      I'm building something similar to what Chunk VNC was, using the Single Click function from UltraVNC to provide remote support.
      My "little monster" is actually working, but the "solution" will have 3 modules:
      SUPPORT: Users will open or install so IT Pros can access their system. VIEWER: IT Pros use to connect to User systems and perform their maintenance GENERATOR: The IT Pro uses to define the configuration for both the SUPPORT and VIEWER apps, like language files for text, SERVER address and ports, Company name, etc. I've attached a screenshot of the SUPPORT app that is done.
      Before anyone points the finger, no I'm not planning on just copying the AutoIt3 files to my project folder and distribute them, I intend to get the IT Pro who will use the GENERATOR to install SciTE and AutoIt3 then the GENERATOR will use them to compile the other two apps.
      The thing is, I need this to be simple, I thought about the GENERATOR having a single screen where the IT Pro can fill in all the information, select the language file and so on, then the GENERATOR compiles both "au3" sources for the SUPPORT and VIEWER.
      I'm using the ResourceEx UDF from Guiness and MetroUI UDF from BBs19. I even made some changes to the MEtroUI, that I shared here.
      This project will be uploaded to my Github account as soon I get this GENERATOR working, so people can actually use it.
      The problem:
      As explained, I need to compile the AU3 source files and perform an Resource Update. SciTE does that for me, right, but I just find sloppy making the GENERATOR open the script on the installed SciTE, clicking in the menus, waiting the process to end and then exit.
      When I hit the Compile or Build on SciTE, it generates this output:
      I've tried emulating this using the promt with console commands:
      It returns an error saying it was not possible to perform a resource update, poiting an TMP file on the ".../AppData/Local/AutoIt3/".
      As I understand, it runs the AutoIt3Wrapper, then the Wrapper should call the Aut2Exe to compile the script and then the Wrapper incorporate the resources into the compiled Script. It generates the file into a TMP one then copies to the directory defined in the Wrapper Directive.
      I know this seems strange, that you think I might be trying to pack AutoIt into my project with no F*** given, no... I just want to automate the compilation process, if there's no solution using console commands, I'll need to automate the process sending keyboard and mouse commands, what will be ugly and problematic.
      So... any help is a heaven's gift at this point.

  • Create New...