ExecDos plug-in: Difference between revisions
Line 53: | Line 53: | ||
<highlight-nsis> | <highlight-nsis> | ||
ExecDos::exec /NOUNLOAD /ASYNC "$EXEDIR\consApp.exe" "test_login$\ntest_pwd$\n" "$EXEDIR\execdos.log" | ExecDos::exec /NOUNLOAD /ASYNC "$EXEDIR\consApp.exe" "test_login$\ntest_pwd$\n" "$EXEDIR\execdos.log" | ||
Pop $0 # thread handle for wait | Pop $0 # thread handle for wait | ||
# you can add some installation code here to execute while application is running. | # you can add some installation code here to execute while application is running. |
Revision as of 06:06, 28 July 2005
Author: Takhir (talk, contrib) |
Links
Download:
ExecDos.zip (40 KB)
Forum thread
Description
Plug-in works with console applications - creates hidden child process with redirected i/o. Compare to nsExec has four add-ons:
- string parameter that serves as stdin for running application - may be useful if you want to give login/password to running application;
- sync/async (background) process launch option - async is good for long running applications;
- it works out of section - for .onInit check outs;
- multithreading - allows to run few applications at the same time.
Plug-in puts log to file (if valid file name defined in the command line) instead of 'detailed' installer window. Maximum input string size for application is 8kB in the special NSIS build, 1 kB otherwise.
'exec' return code depends on the execution mode: application exit code for sync mode and control thread handle for async one. Handle required for 'wait' - it helps to understand what application exit to wait for. If stack is not used between 'exec' and 'wait', both Pop after 'exec' and 'wait' parameter may be skipped - handle just sits in the stack.
Syntax
"exec" DLL function
ExecDos::exec [/NOUNLOAD /ASYNC] ["/BRAND=Some text"] [/TIMEOUT=xxx] application_to_run [stdin_string] [log_file_name]
- Executes console application.
- ASYNC
- Not waits for process exit. Use 'wait' call if you want to get exit code
- BRAND
- Displays text above progress bar (default is "ExecDos plug-in: your_app_name.exe")
- TIMEOUT
- TOTAL execution time, milliseconds, for example /TIMEOUT=10000. Default is big enough. Short timeouts may cause app to
be terminated.
- application_to_run
- application to run.
- stdin_string
- all that application can get from stdin (optional, use "" if stack is not empty)
- log_file_name
- file where to put app's stdout (optional, but use "" if stack is not empty)
"wait" DLL function
ExecDos::wait handle
- Waits for process exit.
- handle
- Control thread handle returned by 'exec' call in the /ASYNC mode.
Example
Sync execution:
ExecDos::exec /TIMEOUT=2000 "$EXEDIR\consApp.exe" "test_login$\ntest_pwd$\n" "$EXEDIR\execdos.log" Pop $0 # return value MessageBox MB_OK "Exit code $0"
Async execution:
ExecDos::exec /NOUNLOAD /ASYNC "$EXEDIR\consApp.exe" "test_login$\ntest_pwd$\n" "$EXEDIR\execdos.log" Pop $0 # thread handle for wait # you can add some installation code here to execute while application is running. ExecDos::wait $0 Pop $0 # return value MessageBox MB_OK "Exit code $0"
BAT files specifics. On some of Win98 systems where "Close on exit" option is not set for DOS apps it was found
that after batch execution was finished (and installer continue it's job) hidden window still remains in the system
as "winoldapp". Following two lines solve the problem
@echo off # place your code here cls
Telnet and ssh Plug-in not works with applications requiring terminal emulation.