Jump to content


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.
Photo

Registry Key wird nich deinstalliert


8 replies to this topic

bernard

bernard
  • Full Members
  • 127 posts

Posted 11 October 2012 - 11:43

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


ali

ali
  • Full Members
  • 1,008 posts

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.

Edited by ali, 11 October 2012 - 14:00.


bernard

bernard
  • Full Members
  • 127 posts

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.


ali

ali
  • Full Members
  • 1,008 posts

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);

bernard

bernard
  • Full Members
  • 127 posts

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.

ali

ali
  • Full Members
  • 1,008 posts

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.


bernard

bernard
  • Full Members
  • 127 posts

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.
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?


ali

ali
  • Full Members
  • 1,008 posts

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.


bernard

bernard
  • Full Members
  • 127 posts

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!