Benutzerdefinierter Aktionen bei Patch
Posted 01 December 2005 - 10:57
Hallo,
ich habe ein MSI-Projekt, bei dem Funktionen aus einer DLL heraus starte. Solange es eine Installation ist, funktioniert auch alles einwandfrei. U.a. braucht diese Funktione auch Supportdateien.
So wenn ich nun einen Patch erstelle, möchte ich aber ein anderes Verhalten haben, als wenn es eine Instalation ist. U.a. wird eine andere Datei benötigt.
Ich weis jetzt nicht, wie ich da am besten heran gehen soll. Die Patch-Funktion nimmt ja "nur" die Differenz zwischen 2 Installationen. Ich habe auch keine Eigenschaft gefunden, die mir sagt, ob es eine Installation oder ein Patch ist. Und wie komme ich an den Patch-Pfad? Laut Doku per Property PATCH, aber das ist eine BOOLEAN, kein string, also irgendwie stimmt da was nicht.
Ach ja ich arbeite mit DevStudio 9. Die DLL rufe ich momentan aus einem Script auf und übergeb den Pfad der Dateien per LPSTR an die DLL.
MfG ronbkub
Posted 02 December 2005 - 11:42
Posted 02 December 2005 - 11:47
Die DLL direkt auführen, da hatte ich das Probelm, dass manchmal die Eigenschaften mit MsiGetProperty nicht richtig kamen. Deswegen übergeb ich im Script den Pfad. So wirds auch allgemeiner. Also da kann ich ja z.B. 2 verschiedene Pfade übergeben, einmal für Patch, einmal für Istallation ohne die Funktion in der DLL verändern zu müssen.
Wie komme ich denn an den Pfad des Patches, wenn ich im Script bin?
Posted 05 December 2005 - 07:56
Ich klick auf "Patch erstellen", aber es passiert nix. Nicht mal ne Fehlermedlung kommt. Der macht einfach nix.
Plz help Was hab ich vergessen?
Posted 05 December 2005 - 10:46
So kann mir nur wirklich niemand sagen, wie ich im Script den Pfad des Patches herausbekomme? Gibts doch sicher irgendeine Eigenschaft oder sowas?????
Posted 05 December 2005 - 10:55
ich kann mit dem Begriff "Pfad des Patches" nix anfangen! Welchen Pfad meinst du den Installationszielpfad den Sourcepfad, den Zielpfad einer Komponente die installiert wird?
Posted 05 December 2005 - 11:01
Beim Patch sind ja keine Supportdateien dabei. Daher will ich diese einfach in einem Verzeichnis mit ausliefern, wo der Patch drinnen ist. Um nun Zugriff auf die Dateien zu bekommen, brauche ich daher nun den Pfad, wo meine update.exe steht
Posted 05 December 2005 - 13:23
Posted 05 December 2005 - 13:28
Und wie du oben ja schon geschrieben hast, zeigt das nur an, ob gerade ein Patch läuft oder nicht. Das fuktioniert ja auch soweit.
Was anderes habe ich bisher nicht gefunden, um den Pfad auszulesen.
Posted 05 December 2005 - 13:50
Ich habe mir die Mühe gemacht dies bereits zu testen und kann dir versichern das bei mir der Wert genau die Eigenschaft aufweist welche du benötigst.
Edited by ali, 05 December 2005 - 13:52.
Posted 05 December 2005 - 13:59
Und wenn ich den Patch in meinem MSI-Script einem String zuweisen will, dann meckert er auch, dass die Typen nicht zusammen passen
string suppDir;
...
suppDir = PATCH;
-> "E:\DevStudio\Projekte\Test\script files\setup.rul(55) : Fehler C8039: String-Wert erforderlich"
Das kommt bei mir.
Wie kann ich denn ein Logfile machen lassen?
Ich test das jetzt nochmal mit der Logdatei, aber davon wird mein PATCH auch kein String ...
Und danke für deine Bemühungen
Posted 05 December 2005 - 14:04
ein logfile kannst du anfertigen:
msiexec.exe /p <patchpfad>\patch.msp /L*V <logpfad>\patch.log
Edited by ali, 05 December 2005 - 14:05.
Posted 05 December 2005 - 14:10
Input-PCP path = 'E:\DevStudio\Projekte\Test\Patch\Interm\PatchTemplate.pcp'
Patch-MSP path = 'E:\DevStudio\Projekte\Test\Patch\Patch\Test Patch.msp'
Temp Folder = 'C:\DOKUME~1\schumann\LOKALE~1\Temp\~pcw_tmp.tmp\'
Patch GUID = '{DCF35849-1FAC-43E9-B963-44802C90280B}'
ListOfPatchGUIDsToReplace = '<none>'
ListOfTargetProductCodes = '*'
PatchSourceList = 'PatchSourceList'
AllowProductCodeMismatches = '1'
AllowProductVersionMajorMismatches = '1'
OptimizePatchSizeForLargeFiles = '<blank>'
ApiPatchingSymbolFlags = '0x00000000'
MsiFileToUseToCreatePatchTables = '<blank>'
SqlCmdToCreatePatchTable = '<blank>'
SqlCmdToCreatePatchPackageTable = '<blank>'
SqlCmdToCreateMsiPatchHeadersTable = '<blank>'
DontRemoveTempFolderWhenFinished = '0'
IncludeWholeFilesOnly = '0'
MinimumRequiredMsiVersion = '200'
Using internal SQL cmd to create 'Patch' table.
Using internal SQL cmd to create 'PatchPackage' table.
Using internal SQL cmd to create 'MsiPatchHeaders' table.
***** Log finishing: 2005-12-05 14:00:49 *****
Das ist meine Logfile.
Ich test das mal wie du gesagt hast mit dem MsiGetProperty. Ich dachte im Script drinne kann man die einfach so mit Namen benutzen ohne die API ... . mal schauen
Posted 05 December 2005 - 14:15
eigentlich werden dort alle Propertys die im MSI Projekt verwendet werden wieder gesetzt!
Edited by ali, 05 December 2005 - 14:16.
Posted 05 December 2005 - 14:22
Posted 05 December 2005 - 14:55
Das wär nett, und dann krieg ich das schon irgendwie hin.
Posted 06 December 2005 - 10:48
string svCblDir;
number nvCount;
begin
MsiGetProperty(hMSI,"TEST",svCblDir,nvCount);
StrRemoveLastSlash ( svCblDir );
MsiSetProperty (hMSI,"TEST",svCblDir );
end;
Posted 08 December 2005 - 22:18
Stefan Krüger
InstallSite.org twitter facebook