Habe InstallShield 2012 Professional Edition, Version 18
Habe Basic MSI Project
Mit CA(Custom Actions) und "Run InstallScript Code" lese ich einen Wert von Regisry
und setze
HKEY_CURRENT_USER\Environment
DltSharedData=<der Wert>
1.
Es handelt sich um eine Custom Action(CA) vom Typ 65536 (Installscript Aufruf). Sie ist als Immediate Execution markiert.
Meine CA hat:
- Execution Scheduling = Always execute
- Install Exec Sequence = After InstallFinalize
- Run During Patch Uninstall = Yes
2.
Mein Script(from Help -> "Environment Variables Example"):
#define WM_WININICHANGE 0x001A
#define HWND_BROADCAST 0xffff
function dltWorkSetEnv(hMSI)
number nResult, nvSize, nvType;
STRING szEnv, svValue;
WPOINTER pEnv;
begin
RegDBSetDefaultRoot(HKEY_CURRENT_USER);
nResult = RegDBGetKeyValueEx ("<meine Firma>\\Environment\\Variables", "DltSharedData", nvType, svValue, nvSize);
nResult=RegDBSetKeyValueEx("Environment","DltSharedData",REGDB_STRING_EXPAND, svValue,-1);
if (nResult >= 0) then
szEnv = "Environment";
pEnv = &szEnv;
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, pEnv);
endif;
end; // function dltWorkSetEnv(hMSI)
3.
Es funktioniert richtig.
Problem:
Start -> Ausführen ->
msiexec.exe /X{GUID} [REMOVE~="ALL" - ??] /L*VX "%TEMP%\mein_un.log"
Nach der UnInstallation bleibt es in Regisrty:
HKEY_CURRENT_USER\Environment
DltSharedData=<der Wert>
Was mache ich falsch?
Im mein_un.log finde ich kein "DltSharedData"!
Danke im Voraus
This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.

Registry Key wird nich deinstalliert
Started by
bernard
, Oct 11 2012 11:43
8 replies to this topic
Posted 11 October 2012 - 13:46
Hi,
nur wenn du einen RegEintrag über MSI setzt, also als Komponente mit Key (->SetupDesign) wird der Eintrag auch beim Uninstall gelöscht. Unter HKCU natürlich nur wenn der installierende User gleich dem deinstallierenden User ist.
Schreibst du aber einen Reg-Eintrag per Script, müsstest du per Script dafür sorgen, dass beim Uninstall der Eintrag wieder gelöscht wird.
Ein weiterer Weg wäre ein Eintrag in der RegistryTable, und das entfernen des Eintrages mit dem Entfernen einer Komponente zu verknüpfen.
nur wenn du einen RegEintrag über MSI setzt, also als Komponente mit Key (->SetupDesign) wird der Eintrag auch beim Uninstall gelöscht. Unter HKCU natürlich nur wenn der installierende User gleich dem deinstallierenden User ist.
Schreibst du aber einen Reg-Eintrag per Script, müsstest du per Script dafür sorgen, dass beim Uninstall der Eintrag wieder gelöscht wird.
Ein weiterer Weg wäre ein Eintrag in der RegistryTable, und das entfernen des Eintrages mit dem Entfernen einer Komponente zu verknüpfen.
Edited by ali, 11 October 2012 - 14:00.
Posted 12 October 2012 - 10:58
1.
QUOTE |
Schreibst du aber einen Reg-Eintrag per Script, müsstest du per Script dafür sorgen, dass beim Uninstall der Eintrag wieder gelöscht wird. |
Es gibt keine andere Scripte.
2.
Fand im Forum:
"Custom Action wird auch bei Uninstall ausgeführt" vom 2011-03-23
- ich änderne Script:
...
nResult = RegDBGetKeyValueEx ("<meine Firma>\\Environment\\Variables", "DltSharedData", nvType, svValue, nvSize);
+ MessageBox("xxxx-"+ svValue,INFORMATION);
nResult=RegDBSetKeyValueEx("Environment","DltSharedData",REGDB_STRING_EXPAND, svValue,-1);
...
- Ich lösche den Key
HKEY_CURRENT_USER\Environment\DltSharedData
- führe die Uninstallation mit
msiexec.exe /X{GUID} /L*VX "%TEMP%\mein_un.log"
aus
- wird Key DltSharedData erstellt.
Im mein_un.log finde ich keine Information über DltSharedData.
Posted 12 October 2012 - 11:28
Hallo,
ich glaube ich verstehe nicht ganz wo jetzt dein Problem liegt. Möchtest du den Eintrag jetzt mit der Deinstallation löschen, oder möchtest du, dass deine CA bei der Deinstallation nicht ausgeführt wird?
Du hast ein Script, dieses Script schreibt einen Regeintrag. Wenn du dieses Script auch beim Uninstall ausführst, dann wird der Regeintrag auch beim Uninstall in die Registry geschrieben. Ob das CA beim Uninstall ausgeführt wird, siehst du im log wenn du nach der Bezeichnung deiner CA schaust. Wenn du weiter Informationen aus deinem Script im LogFile haben möchtest, kannst du diese durch Aufruf von SprintfMsiLog im Script in das Log schreiben.
SprintfMsiLog ( "Info %s mit Returnwert %d " , svInfo, nvReg);
ich glaube ich verstehe nicht ganz wo jetzt dein Problem liegt. Möchtest du den Eintrag jetzt mit der Deinstallation löschen, oder möchtest du, dass deine CA bei der Deinstallation nicht ausgeführt wird?
Du hast ein Script, dieses Script schreibt einen Regeintrag. Wenn du dieses Script auch beim Uninstall ausführst, dann wird der Regeintrag auch beim Uninstall in die Registry geschrieben. Ob das CA beim Uninstall ausgeführt wird, siehst du im log wenn du nach der Bezeichnung deiner CA schaust. Wenn du weiter Informationen aus deinem Script im LogFile haben möchtest, kannst du diese durch Aufruf von SprintfMsiLog im Script in das Log schreiben.
SprintfMsiLog ( "Info %s mit Returnwert %d " , svInfo, nvReg);
Posted 15 October 2012 - 10:42
Danke für den Tipp.
QUOTE |
... oder möchtest du, dass deine CA bei der Deinstallation nicht ausgeführt wird? |
Ja!
Meine CA "dltWorkProduct_GUID" hat jetzt:
- Execution Scheduling = Always execute
- Install Exec Sequence = After InstallFinalize
- Install Exec Condition = Not Installed
- Run During Patch Uninstall = No
1.
CA wird beim Uninstall nicht ausgeführt.
Im mein_un.log finde ich:
...
MSI (s) (04:1C) [11:14:40:765]: Skipping action: dltWorkProduct_GUID (condition is false)
Action ended 11:14:40: InstallFinalize. Return value 1.
...
2.
Leider bleibt es nach dem Uninstall in Regisrty:
HKEY_CURRENT_USER\Environment
DltSharedData=<der Wert>
Brauche die Hilfe immer noch.
Posted 15 October 2012 - 10:48
also 1. ist erledigt, du willst das die CA beim Uninstall nicht ausgeführt wird, das wird sie jetzt auch nicht mehr.
QUOTE |
2. Leider bleibt es nach dem Uninstall in Regisrty: HKEY_CURRENT_USER\Environment DltSharedData=<der Wert> |
Du sagst das die Einträge nach dem Uninstall stehen bleiben, was tust du wo und wie um die Einträge beim Uninstall zu löschen?
Edited by ali, 15 October 2012 - 10:49.
Posted 15 October 2012 - 11:32
1.
Custom Actions -> dltWorkProduct_GUID
- Function Name = dltWorkSetEnv
- Execution Scheduling = Always execute
- Install Exec Sequence = After InstallFinalize
- Install Exec Condition = Not Installed
- Run During Patch Uninstall = No
2.
Mein Script:
#define WM_WININICHANGE 0x001A
#define HWND_BROADCAST 0xffff
function dltWorkSetEnv(hMSI)
number nResult, nvSize, nvType;
STRING szEnv, svValue;
WPOINTER pEnv;
begin
RegDBSetDefaultRoot(HKEY_CURRENT_USER);
nvSize = RegDBGetKeyValueEx ("<meine Firma>\\Environment\\Variables", "DltSharedData", nvType, svValue, nvSize);
if (nvSize > 0) then
// MessageBox("dltWorkSetEnv: > 0 - " + svCONFIGRegGetStr_Buf,INFORMATION);
SprintfMsiLog("CA -> dltWorkSetEnv > 0: svCONFIGRegGetStr_Buf= %s",svCONFIGRegGetStr_Buf);
nResult=RegDBSetKeyValueEx(szKey,"DltSharedData",REGDB_STRING_EXPAND, svCONFIGRegGetStr_Buf,-1);
if (nResult >= 0) then
szEnv = "Environment";
pEnv = &szEnv;
SendMessage (HWND_BROADCAST, WM_WININICHANGE, 0, pEnv);
endif;
else
SprintfMsiLog("CA -> dltWorkSetEnv < 0: svCONFIGRegGetStr_Buf= %s",svCONFIGRegGetStr_Buf);
endif;
end; // function dltWorkSetEnv(hMSI)
3.
Custom Actions -> dltWorkProduct_GUID
- Function Name = dltWorkSetEnv
- Execution Scheduling = Always execute
- Install Exec Sequence = After InstallFinalize
- Install Exec Condition = Not Installed
- Run During Patch Uninstall = No
2.
Mein Script:
#define WM_WININICHANGE 0x001A
#define HWND_BROADCAST 0xffff
function dltWorkSetEnv(hMSI)
number nResult, nvSize, nvType;
STRING szEnv, svValue;
WPOINTER pEnv;
begin
RegDBSetDefaultRoot(HKEY_CURRENT_USER);
nvSize = RegDBGetKeyValueEx ("<meine Firma>\\Environment\\Variables", "DltSharedData", nvType, svValue, nvSize);
if (nvSize > 0) then
// MessageBox("dltWorkSetEnv: > 0 - " + svCONFIGRegGetStr_Buf,INFORMATION);
SprintfMsiLog("CA -> dltWorkSetEnv > 0: svCONFIGRegGetStr_Buf= %s",svCONFIGRegGetStr_Buf);
nResult=RegDBSetKeyValueEx(szKey,"DltSharedData",REGDB_STRING_EXPAND, svCONFIGRegGetStr_Buf,-1);
if (nResult >= 0) then
szEnv = "Environment";
pEnv = &szEnv;
SendMessage (HWND_BROADCAST, WM_WININICHANGE, 0, pEnv);
endif;
else
SprintfMsiLog("CA -> dltWorkSetEnv < 0: svCONFIGRegGetStr_Buf= %s",svCONFIGRegGetStr_Buf);
endif;
end; // function dltWorkSetEnv(hMSI)
3.
QUOTE |
...was tust du wo und wie um die Einträge beim Uninstall zu löschen? |
Es ist mein Problem.
Wie kann ich meine Scripte ergänzen?
Posted 15 October 2012 - 11:40
Wieso ergänzen? wenn du schon beim Script bist, erstelle doch eine 2. Funktion zum löschen, die du in eine neue CA einbindest, die CA könntest du mit der Bedingung REMOVE~="ALL" aufrufen.
Edited by ali, 15 October 2012 - 11:40.
Posted 15 October 2012 - 14:58
Danke ali!
Lösung:
1.
neue CA -> New InstallScript:
- Function Name = DltSharedData_Delete
- Execution Scheduling = Always execute
- Install Exec Sequence = After InstallFinalize (for dltWorkProduct_GUID)
- Install Exec Condition = REMOVE~="ALL"
- Run During Patch Uninstall = No
2.
function DltSharedData_Delete(hMSI)
NUMBER nvSize, nv_Type, nv_DelKey;
STRING szKey, svValue;
begin
RegDBSetDefaultRoot( HKEY_USER_SELECTABLE );
szKey="Environment";
if ( RegDBGetKeyValueEx (szKey, "DltSharedData", nv_Type, svValue, nvSize) = 0 ) then
SprintfMsiLog("CA -> DltSharedData_Delete: svValue = %s",svValue);
nv_DelKey = RegDBDeleteValue(szKey, "DltSharedData");
if ( nv_DelKey < 0 ) then
SprintfMsiLog("CA -> DltSharedData_Delete: RegDBDeleteValue (szKey, DltSharedData) < 0");
else
SprintfMsiLog("CA -> DltSharedData_Delete: RegDBDeleteValue (szKey, DltSharedData) >= 0");
endif;
else
SprintfMsiLog("CA -> DltSharedData_Delete: RegDBGetKeyValueEx < 0");
endif;
end; // function DltSharedData_Delete(hMSI)
Test:
1. bei der Installation im log-file:
...
Action ended 15:39:36: InstallFinalize. Return value 1.
MSI (s) (3C:04) [15:39:36:437]: Skipping action: DltShared_Del (condition is false)
MSI (s) (3C:04) [15:39:36:437]: Doing action: dltWorkProduct_GUID
2. nach dem Uninstall mit
msiexec.exe /X{GUID} /L*VX "%TEMP%\mein_un.log"
im mein_un.log:
...
Action ended 15:39:52: InstallFinalize. Return value 1.
Action start 15:39:52: DltShared_Del.
1: CA -> DltSharedData_Delete: svValue = xxx
...
1: CA -> DltSharedData_Delete: RegDBDeleteValue (szKey, DltSharedData) >= 0
Jetzt funktioniert alles richtig!
Lösung:
1.
neue CA -> New InstallScript:
- Function Name = DltSharedData_Delete
- Execution Scheduling = Always execute
- Install Exec Sequence = After InstallFinalize (for dltWorkProduct_GUID)
- Install Exec Condition = REMOVE~="ALL"
- Run During Patch Uninstall = No
2.
function DltSharedData_Delete(hMSI)
NUMBER nvSize, nv_Type, nv_DelKey;
STRING szKey, svValue;
begin
RegDBSetDefaultRoot( HKEY_USER_SELECTABLE );
szKey="Environment";
if ( RegDBGetKeyValueEx (szKey, "DltSharedData", nv_Type, svValue, nvSize) = 0 ) then
SprintfMsiLog("CA -> DltSharedData_Delete: svValue = %s",svValue);
nv_DelKey = RegDBDeleteValue(szKey, "DltSharedData");
if ( nv_DelKey < 0 ) then
SprintfMsiLog("CA -> DltSharedData_Delete: RegDBDeleteValue (szKey, DltSharedData) < 0");
else
SprintfMsiLog("CA -> DltSharedData_Delete: RegDBDeleteValue (szKey, DltSharedData) >= 0");
endif;
else
SprintfMsiLog("CA -> DltSharedData_Delete: RegDBGetKeyValueEx < 0");
endif;
end; // function DltSharedData_Delete(hMSI)
Test:
1. bei der Installation im log-file:
...
Action ended 15:39:36: InstallFinalize. Return value 1.
MSI (s) (3C:04) [15:39:36:437]: Skipping action: DltShared_Del (condition is false)
MSI (s) (3C:04) [15:39:36:437]: Doing action: dltWorkProduct_GUID
2. nach dem Uninstall mit
msiexec.exe /X{GUID} /L*VX "%TEMP%\mein_un.log"
im mein_un.log:
...
Action ended 15:39:52: InstallFinalize. Return value 1.
Action start 15:39:52: DltShared_Del.
1: CA -> DltSharedData_Delete: svValue = xxx
...
1: CA -> DltSharedData_Delete: RegDBDeleteValue (szKey, DltSharedData) >= 0
Jetzt funktioniert alles richtig!