I'm trying to run Autodesk Inventor deployment image using
Process.Start()
and then using
WaitForExit()
perform another operation after the installation is done.
This is not working because deployment image runs on two occasions.
First "setup initialization" which is collecting various required informations and second "installing software" that actually performs the installation.
Both occasions have their own process (setup.exe) in taskmanager with its own unique PID and my problem is that WaitForExit triggers after the "setup initialization" is completed.
Any suggestion how to handle this properly?
Related
I have created MSI using WIX 3.11. I have made some customization to the Installer to install the application in a custom folder. I am also writing Install path to registry value under HKLM\Software.
I am reading registry value in batch file for one of my use-case.
Installation is successful and the application is running fine.
But while uninstalling, I am facing below issue -
Uninstall window pops up with the message - The following applications should be closed before continuing the Install: [MyApplication]
In uninstall log while removing the service, I see below error - Error 1722. There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor.
If I remove the service manually, no errors can be seen and the service is getting deleted. Not sure why Uninstall is failing.
Please shed some light on this.
Stop Service Before Uninstall: In the compiled MSI, what entries do you have in the ServiceControl table? You need to stop the service before its executable is deleted. See WiX service installation sample linked to below.
Failing Custom Action: It is also possible that you have a custom action which tries to run a batch file that has already been uninstalled when you try to run it. This can be a custom action that should not run on uninstall (conditioning is wrong), or you have sequenced it incorrectly so the batch file is gone from disk - courtesy of the uninstall - before the custom action can run successfully. You need to move the custom action earlier in the installation / un-installation sequence or condition it better so it never runs on uninstall. Both issues are very common. Be aware that it is common to fail to condition custom actions so they run unexpectedly. Very often they run during major upgrade uninstalls undesirably.
Batch Files CAs: For what it is worth - and no offense: using batch files in custom action is an MSI anti-pattern in my opinion. There is basically zero error handling and hence no management and recovery from error conditions. And generally no MSI rollback support. C++ custom actions are best in my view (minimal dependencies, good debugability, full featured language, large down-to-the-metal API). Just so it is mentioned. It all depends how large your distribution is. For in-house appliations one can get away with more than for truly global package distribution. This has to do with the complexity of deployment (see section a bit down the page). There are so many error sources.
WiX Service Installation: Maybe see this hands on WiX-markup sample from Rainer Stropek: WiXSamples - github.com/rstropek. Please check
the ServiceControl element.
Common MSI Problems: I hate to "pitch" this content. It is essentially the things you can't easily find in books - and for good reason. Some rules of thumb and opinions in a chaotic form, but here it is if you want to check it out: How do I avoid common design flaws in my WiX / MSI deployment solution? Just honest opinions and practical advice - no claim to be "right", but it should help setup reliability. Hopefully.
I'm developing a windows application (using vb.net) that can install various versions of runtimes like vc++, Direct X, .net frameworks etc on a PC. My program must be able to to run the runtime installers (msi & exe) one at a time in the background and do the following:
1.Check weather the runtime is already (previously) installed or not.
2.Show the installation progress in a progress bar in the main form of my program.
3.And at last get the return code (exit code) from the installer to indicate weather the installation was successful or not.
What are the codes required to perform the above tasks?
Also I want to know what are all the possible return codes(values) an installer can return.
All of those redistributables might have different command line options, so it's not likely to be one answer for everything.
It's not clear how you can get the installation progress. It's almost certainly impossible or very difficult. You're asking how you can run a program that will "steal" the output of some other program, and in many cases that will be Windows Installer. If I had a program that fired off a Windows Form program, then you're asking "how can I get the content of that program and steal the output messages". That's not an install question, it's a Windows messaging/windows message loop question.
The detection methods used by those setups are coded internally (or configured as internal data), so you're also asking how the code in all those programs detects that the dependency isn't installed (on multiple OS versions and 32-bit and 64-bit), and some of that might be available on the web but it's unlikely that it is readily available for every redistributable.
You might also have an issue with EULAs. Some redistributables need a EULA to be accepted and might not install unless it's accepted, or some may have a command line option that includes something like (just an example) ACCEPTEULA=1.
Basically you should:
Find the command line options available for all those redistributables to see if they have an option that displays only progress, then let them show that.
Similarly, see if they have documentation that tells you if the exit code means success or not.
Don't bother trying to find all the detection methods for everything - just run the redist, and if the target is already installed it won't do anything.
Finally, you are re-inventing the wheel. WiX, the Bootstrap Manifest Generator, InstallShield, Advanced Installer (and so on) all provide bootstrapper programs that already do this as prerequisites for installing software. Nobody writes code to do this any more because there are existing solutions.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa376931(v=vs.85).aspx
1638 for already installed. 0 for successful installation. Yet mind 3010 which stands for success but pending reboot.
About showing progress in parent window .. this may be not a trivial task. Hopefully someone else can give you a hand with that.
I want to check if a process is running before installing a new add-in using the advance installer. To make that, in custom Actions, I select detect process and put the process that I want to stop. With that I get AI_PROCESS_STATE Running or Stopped. But now I don't know what to do to stop the installation if it is Running or at least show a message telling that is necessary to close it before continue.
There are options like display message box but if I put them they always appear. I don't know how to make them appear only when AI_PROCESS_STATE has the value Running.
There are several problems here:
The general way to do this is to call a custom action Dll that looks for the process, and sets an installer property if the process is running, then you can fail the install with a type 19 custom action and your own error message. Running a process doesn't give you a good way to return a value into the install so you can show an error message.
However, getting the list of processes requires elevation, and by default you're not elevated at the start of the install.
Are you sure you're not inventing a problem? Why should the user shut down the process? The user-friendly approach is to register your add-in and tell the user they may need to restart the app before their new add-in will show up.
I have another question regarding exe's and custom actions within Installshield.
I currently have a set of custom actions which launch executables in silent mode..
In the return process, it is set for Synchronous(Check exit code) mode, and it is set for a Deferred Execution in System Context.
My question is the following:
When I install my application, it is fine. It runs through the installers and installs the prerequisites. My problem is when I want to uninstall the application from the machine, because it runs through the same installers again (and trys to install them again, even though we are uninstalling).
I looked all around, and cannot find a good work-around for this.
Anyone have experience with this and know of a method of getting the installs to only run when the installer runs and not when uninstalling?
Much Appreciated...
Thanks
-Kyle
You have to condition your CustomAction to "Not Installed". The condition "Not Installed" ensures the action runs only during a first-time installation, and not during maintenance mode or uninstallation.
Check this link from Flexera: http://www.flexerasoftware.com/webdocuments/PDF/IS_Tip_Executable-Custom-Actions-for-MSIs.pdf
How about a custom action condition like "Not Installed". This means it will only run on a first-time installation, not "maintenance" or "uninstall".
I am using Installshield, and have had success in launching my exe install files (such as KLite) after all my files have transferred to their target destination.
My question is this:
I am currently able to launch all the install exe's necessary, but they all launch at the same time, which can be rather annoying and cluttering. I am using a "Custom Action" to launch each executable. I am trying different "In-Script Execution" properties to no avail. My "Return Processing" is set to Asynchronous(Waits for exit code), yet it still is giving me problems.
I'd like to have each one execute once the previous is completed.
Anyone have experience in this? It has to be possible...
Thanks,
-Kyle
You want Sync not ASync. BTW, I don't reccomend EXE CA's except in the rarest of situations. Primarily because they are out of process with very limited ability to report back success and 0 ability to write back to the Windows Installer Log and have very unprofessional flashing of DOS CMD windows.
Always try to use C++ / C# custom actions instead.
Also be sure to read the following:
Integration Hurdles for EXE Custom Actions
http://blogs.msdn.com/b/windows_installer_team/archive/2007/10/20/integration-hurdles-for-exe-custom-actions.aspx
If you must use an EXE be sure to use something like WiX QuiteCA ( you can wrap this up into a WiX merge module and consume it with your InstallShield Basic MSI project ) to help shield you from these problems and get improved logging.