PDA

View Full Version : Run script (or something) on uninstall??



ZenDragon
03-07-2008, 10:52 AM
My install package modifies a registry key that needs to be set back to a certain value on uninstall. However, uninstalling deletes the key entirely. How can I write a default value back to the key instead of deleting it during an uninstall?

ZenDragon
03-10-2008, 10:38 AM
Nothing?? Do the macrovision employees not even peruse this forum??

MarkEarle
03-10-2008, 02:21 PM
Are you using InstallScript or MSI?

ME

ZenDragon
03-10-2008, 03:37 PM
Are you using InstallScript or MSI?

ME

Thanks for the response...
Im trying to create an MSI for a deployment.... "Basic MSI Project" if that answers your question.

MarkEarle
03-10-2008, 03:55 PM
Okay,

Here we go. I am going to assume you defined this registry key and associated it to a Component. Navigate to the Component => Registry Data and find the key you want to have as permanent. Create a dummy value as this will allow the key to get created or modified but not removed during uninstallation. To make the key permanent you create a dummy value named with the plus + sign and do not enter any value data. That's it.

Hope this helps you. :)

Cheers,

ME

ZenDragon
03-10-2008, 04:14 PM
Okay,

Here we go. I am going to assume you defined this registry key and associated it to a Component. Navigate to the Component => Registry Data and find the key you want to have as permanent. Create a dummy value as this will allow the key to get created or modified but not removed during uninstallation. To make the key permanent you create a dummy value named with the plus + sign and do not enter any value data. That's it.

Hope this helps you. :)

Cheers,

ME

Im sorry, you lost me there. The value I need to set back is a value that existed before the install. Make sense? The key specifically is the Userinit key that origionally runs "userinit.exe". My install simply replaces that value, but upon uninstall the entire key is removed. Which obviously prevents the GUI (explorer.exe) from loading at all.

Im looking in component view at the ISRegistryComponent and I see where my value is defined in there but Im not sure I understand where/how I should be creating a "dummy" value.

I very much appreciate your help by the way!

ZenDragon
03-10-2008, 04:54 PM
I see the option to set is as permenant, which looks like it will prevent it from being deleted. However, I still dont see how to set it back to its original value.

MarkEarle
03-11-2008, 07:20 AM
ZenDragon,

I am more familiar with InstallScript so I can give you a very simple way of doing this with a couple InstallScript functions that can be called in a custom action.

Instead of adding the registry key to the Component make your changes in the script.


export prototype _UpdateRegValue( HWND );
export prototype _ResetRegValue( HWND );

function _UpdateRegValue( hMSI )
NUMBER nResult, nvType, nvSize;
STRING szKey, szName, svValue;
begin
Disable( LOGGING );
RegDBSetDefaultRoot( HKEY_LOCAL_MACHINE );
nResult = RegDBGetKeyValueEx( szKey, szName, nvType, svValue, nvSize );
if( nResult = 0 ) then
// Save the value of the key somewhere. The value is returned in svValue...

// Set your value now...
svValue = <What you want to set it to>;
nResult = RegDBSetKeyValueEx( szKey, szName, nvType, svValue, nvSize );
if( nResult = 0 ) then
SprintfBox( INFORMATION, "", "Successfully inserted %s registry information", szName );
else
SprintfBox( WARNING, "Insertion of registry information for %s failed(%lu)", szName, nResult );
endif;
else
// Failure path...
endif;
Enable( LOGGING );
end;

function _ResetRegValue( hMSI )
NUMBER nResult, nvType, nvSize;
STRING szKey, szName, svValue;
begin
Disable( LOGGING );
RegDBSetDefaultRoot( HKEY_LOCAL_MACHINE );

// Reset your value now from where you saved it...
svValue = <What you want to reset it to>;
nResult = RegDBSetKeyValueEx( szKey, szName, nvType, svValue, nvSize );
if( nResult = 0 ) then
SprintfBox( INFORMATION, "", "Successfully reset %s registry information", szName );
else
SprintfBox( WARNING, "Reset of registry information for %s failed(%lu)", szName, nResult );
endif;
Enable( LOGGING );
end;

These are really basic functions with minimal error checking so you should tweak them if you use them at all. Then you have to add the custom actions in you MSI project. I have quoted the instructions from Macrovision below:


To Do: Create a custom action for this entry-point function:
1. Right-click on "Custom Actions" in the Sequences/Actions view.
2. Select "Custom Action Wizard" from the context menu.
3. Proceed through the wizard and give the custom action a unique name.
4. Select "Run InstallScript code" for the custom action type, and in
the next panel select "MyFunction" (or the new name of the entry-
point function) for the source.
5. Click Next, accepting the default selections until the wizard
creates the custom action.

Once you have made a custom action, you must execute it in your setup by
inserting it into a sequence or making it the result of a dialog's
control event.

And there you go. When you use Disable( LOGGING )/Enable( LOGGING ) the installation doesn't know anything about the actions you took so it is up to you to ensure you fix whatever you changed. In this case if you make or change a registry value it doesn't get removed or reset.

I know it was long winded but I hope it helps.

Cheers,

ME

ZenDragon
03-11-2008, 11:25 AM
Pardon my ignorance... but I still dont see how it is running that on "uninstall". All I need to do is set the reg value back to "userinit.exe" when the user uninstalls the package. The actual setting of the registry value works fine.

RobertDickau
03-11-2008, 11:48 AM
Please see this newsletter tip for information on conditions that identify installation and uninstallation (PDF warning): http://www.macrovision.com/webdocuments/PDF/msiconditions.pdf.

MarkEarle
03-11-2008, 11:55 AM
What you have to do is call the custom action you created just before InstallFinalize. The InstallFinalize action is the last transacted action taken by the installation package. If you look up InstallFinalize in the help files it will give you more information. So the steps are:


Add a script file to your project and craft your exported functions.
Create a custom action as per the instructions from my last post that calls the functions.
Move that action to just before InstallFinalize so it is the second last thing your package does. Make sure you have figured out if you are installing/uninstalling or you may get bad results.


Cheers,

ME

ZenDragon
03-11-2008, 01:16 PM
I must be doing something wrong here... I went to install sscript and created a new script with the aformentioned code. I then went through the custom action process and created an action. However when I try to build the msi I get an error message "Error compiling Setup.rul. Setup.rul is required to be included in the project..."

I dont mind doing it this why but I dont understand why this has to be so complicated. Im fairly new with this poduct in general, and I know NOTHING about InstallScript, I was hoping all of this could be done through the gui. I dont want to overcomplicate this and not be able to troubleshoot when something goes wrong.

Anyhow, again I very much appreciate your assistance.

UPDATE: I worked through that issue. Just had to rename my rul file back to setup.rul which I guess is what its expecting. Anyhow if I try to compile the rul file or build another msi I get the following errors fromt he script:

C:\Files\Setup\FMI Login Banner\script files\setup.rul(8) : error C8025: 'Disable' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(9) : error C8025: 'RegDBSetDefaultRoot' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(10) : error C8025: 'RegDBGetKeyValueEx' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(10) : error C8041: '(' : function type required
C:\Files\Setup\FMI Login Banner\script files\setup.rul(16) : error C8025: 'RegDBSetKeyValueEx' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(16) : error C8041: '(' : function type required
C:\Files\Setup\FMI Login Banner\script files\setup.rul(18) : error C8025: 'SprintfBox' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(20) : error C8025: 'SprintfBox' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(25) : error C8025: 'Enable' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(32) : error C8025: 'Disable' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(33) : error C8025: 'RegDBSetDefaultRoot' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(37) : error C8025: 'RegDBSetKeyValueEx' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(37) : error C8041: '(' : function type required
C:\Files\Setup\FMI Login Banner\script files\setup.rul(39) : error C8025: 'SprintfBox' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(41) : error C8025: 'SprintfBox' : undefined identifier
C:\Files\Setup\FMI Login Banner\script files\setup.rul(43) : error C8025: 'Enable' : undefined identifier

ZenDragon
03-12-2008, 03:13 PM
Anyone there?

RobertDickau
03-12-2008, 03:42 PM
Please verify that this line is at the top of your script:

#include "ifx.h"

The header file ifx.h contains prototypes for a large set of built-in InstallScript functions.

ZenDragon
03-13-2008, 03:17 PM
Please verify that this line is at the top of your script:

#include "ifx.h"

The header file ifx.h contains prototypes for a large set of built-in InstallScript functions.


That was it :) Thanks, glad it was something simple.

MarkEarle
03-17-2008, 11:29 AM
ZenDragon,

Is it fixed? I was away for March Break so I couldn't reply? You got the IS master when Robert answered. Anyway hope the help worked.

Cheers,

ME