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

Probleme mit INSTALLDIR


5 replies to this topic

GeroldF

GeroldF
  • Members
  • 6 posts

Posted 29 July 2005 - 13:54

InstallShield 10.5; InstallScript MSI Projekt

Bei einer Neuinstallation wird der Installationspfad abgefragt und nach INSTALLDIR geschrieben. Der Rest der Scripte basiert dann auf INSTALLDIR. Installshield hinterlegt nun diesen Pfad in InstallLocation in der Registry. Auch gut.
Beim Update wird dieser Pfad leider nicht wieder zurückgelesen sondern INSTALLDIR ist mit dem Defaultwert geladen. Dies hat zur Folge, dass die Installation schief läuft.

Wie bekomme ich nun den richtigen Installationspfad in INSTALLDIR zurück?

Ich hoffe es weiss jemand Rat,da ich an diesem Punkt schon sehr lange rummache. Danke

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 29 July 2005 - 16:34

Du könnest es zum Beispiel aus der Registry lesen?

GeroldF

GeroldF
  • Members
  • 6 posts

Posted 01 August 2005 - 08:59

Zugegebener Maßen habe ich daran auch schon gedacht. Da InstallShield den Pfad selbst in die Registry schreibt, dachte ich, daß das Programm den Pfad auch selbständig zurück liest.

Ich habe hier im Forum gesehen, daß noch mehr Leute Probleme mit den Updates haben. Warum ist es eigentlich so schwierig mit InstallScript MSI Projekten einen sauberen Update hinzubekommen?

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 01 August 2005 - 13:38

Weil hier zwei unterschiedliche Technologien "zwangs-verheiratet" wurden. Ein Teil des Setups wird mit InstalLScript ausgeführt, ein anderer Tiel mit MSI. Beide verwenden unterschiedliche Installations-, Deinstallations-, und Update-Mechanismen. Dieses Zusammensoiel klappt oft nicht zuverlässig.

SBecker

SBecker
  • Members
  • 3 posts

Posted 02 August 2005 - 17:36

Ja des nervt total. Das Problem hatte ich auch mal.

Ich habe mir eine Funktion geschrieben die mir die benötigten Infos aus der Registry liest. Die Suche geht über den ProductCode.

Gruß

Sascha


Beispiel:

GetOldInstPathFromRegistry("DFDC54B0-868D-4F65-BBB6-BBD4BE12ED2F", szPath);


// Format ABC to CBA
prototype RevertLettersAndAdd(STRING, NUMBER, NUMBER, BYREF STRING);
function RevertLettersAndAdd(szSource, nFrom, nTo, szDrain)
INT iIndex;
STRING svSubStr, svReverted;
begin
svReverted = "";

for iIndex = nTo-1 downto nFrom-1
StrSub ( svSubStr , szSource , iIndex , 1 );
svReverted = svReverted + svSubStr;
endfor;

szDrain = szDrain + svReverted;
end;

prototype GetOldInstPathFromRegistry(STRING, BYREF STRING);
function GetOldInstPathFromRegistry(szProductCode,szPath)
LIST listKeys;
NUMBER nResult, nType,nvSize;
STRING szItem, szKey, svValue, szProductCodeFormated , svSubStr;
BOOL bFoundPath;
begin
// Format szProductCode from
// DFDC54B0-868D-4F65-BBB6-BBD4BE12ED2F to
// 0B45CDFDD86856F4BB6BBB4DEB21DEF2 which can be found in my component
RevertLettersAndAdd(szProductCode, 5,8,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 1,4,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 10,13,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 15,18,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 20,21,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 22,23,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 25,26,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 27,28,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 29,30,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 31,32,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 33,34,szProductCodeFormated);
RevertLettersAndAdd(szProductCode, 35,36,szProductCodeFormated);

listKeys = ListCreate(STRINGLIST);

RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);

szKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\S-1-5-18\\Components";
RegDBQueryKey ( szKey , REGDB_KEYS , listKeys );

bFoundPath = FALSE;
szPath = "";
nResult = ListGetFirstString (listKeys, szItem);

// Look if one component has my ProductCode
while (nResult != END_OF_LIST && bFoundPath==FALSE)
if (RegDBGetKeyValueEx (szKey + "\\"+ szItem, szProductCodeFormated, nType, svValue, nvSize) = 0) then
if ExistsDir ( svValue ) = 0 then // Is it realy existing ?
bFoundPath = TRUE;
szPath = svValue;

endif;
endif;
nResult = ListGetNextString (listKeys, szItem);
endwhile;

end;



Guest_jminstall

Guest_jminstall
  • Guests

Posted 22 November 2010 - 17:22

Falls nochmal jemand Bedarf für obigen Code hat (den wir auch erfolgreich eingesetzt haben): auf 64bit-Systemen (derzeit die entsprechende Version von Windows 7 oder Server 2008) funktioniert der Workaround nicht mehr, d.h. INSTLLDIR enthält dann das Standard-Installationsverzeichnis C:\program files (x86)\...

Der Wert aus der Registry muss daher auf 64bit-System aus einer anderen Stelle ausgelesen werden. Nähere Infos dazu finden sich hier:
http://www.windowsit...ry-subkey-.aspx