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

Benutzerdefinierter Aktionen bei Patch


22 replies to this topic

ronkub

ronkub
  • Members
  • 14 posts

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

ronkub

ronkub
  • Members
  • 14 posts

Posted 02 December 2005 - 08:24

echt niemand ne Idee oder ein Ansatz?

ali

ali
  • Full Members
  • 1,008 posts

Posted 02 December 2005 - 11:42

also das Property PATCH, kannst du als bedingung verweden um zwischen der Installation und einem Patch zu unterscheiden. Wenn du eine Custom Action erstellst und sie mit der Bedingung PATCH versiehst, den wird diese CA auch nur beim Patch ausgeführt. Machst du ein Patch oder ein QuickPatch? Wenn du PRoperty Werte brauchst die du beim Patchen verwenden willst, fürhre am besten ein Pacth aus und erstelle eine log Datei mit /L*V und schau dir an welche Werte du verwenden kannst. eine DLL würde ich persönlich nicht als Script ausführen sondern als CA (Funktion in einer Standard DLL). Dann bekommt der Installer auch was mit.

ronkub

ronkub
  • Members
  • 14 posts

Posted 02 December 2005 - 11:47

Kein Quickpatch, sondern Patch, der im Basic MSI Projekt mit drinnen ist.
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?

ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 07:56

Hm mal noch ne Frage zum Erstellen des Patches: Der macht das jetzt nict mehr blink.gif
Ich klick auf "Patch erstellen", aber es passiert nix. Nicht mal ne Fehlermedlung kommt. Der macht einfach nix.
Plz help huh.gif Was hab ich vergessen?

ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 10:46

Nur für die, die es interessiert: das scheint ein Bug zu sein. Wenn ich neues minimalistisches Testprojekt mache, kann ich dort nen Patch erstellen. Geh ich nun wieder in mein eigentliches Projekt, funktioniert der "Patch erstellen"-Button auf einmal wieder.

So kann mir nur wirklich niemand sagen, wie ich im Script den Pfad des Patches herausbekomme? Gibts doch sicher irgendeine Eigenschaft oder sowas?????

ali

ali
  • Full Members
  • 1,008 posts

Posted 05 December 2005 - 10:55

Hallo Ronkub,
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?

ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 11:01

Den Pfad der update.exe

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

ali

ali
  • Full Members
  • 1,008 posts

Posted 05 December 2005 - 13:23

laut der MSI FAQ sollte der vollständige Pfad zum Patch Paket im Property PATCH stehen. Frage ist nur wann du das Script ausführst, evtl. ist das Property zum Zeitpunkt der Ausführung (noch) gar nicht belegt. Abhilfe wird wie schon oben beschrieben eine Log Datei schaffen, in der nachvollziehbar ist welche Propertys mit welchen Werten gefüllt sind.

ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 13:28

Das in der Doku habe ich auch gelesen, aber das scheint falsch zu sein. PATCH is ne boolean
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.

ali

ali
  • Full Members
  • 1,008 posts

Posted 05 December 2005 - 13:50

mir scheint das du meine Antworten nicht richtig durchliest. Wenn du dir nun einmal die Mühe machst dir ein Patch zu erstellen und dieses auf eine Installation anzuwenden mit Erstellung eines log Files, dann würdest du schon längst wissen was du wissen willst. Unter anderem, dass die PROPERTY PATCH kein Boolean ist.
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.


ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 13:59

Und ich habe im Verzeichnis des DevStudios nach der Deklaration dieser Variable gesucht, und da stand bei mir BOOLEAN da, wirklich, das is kein Scherz.

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 ... sad.gif

Und danke für deine Bemühungen smile.gif

ali

ali
  • Full Members
  • 1,008 posts

Posted 05 December 2005 - 14:04

wenn du ein MsiGetProperty auf das Property PATCH machst, weils ja ein Property ist, müsstest du anhand des Ergebnisses auswerten können ob du ein Patch hast oder nicht und welche Wert es hat, denn das Property Patch ist nur gefüllt wenn du auch ein Patch durchführst.

ein logfile kannst du anfertigen:

msiexec.exe /p <patchpfad>\patch.msp /L*V <logpfad>\patch.log

Edited by ali, 05 December 2005 - 14:05.


ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 14:10

***** Log starting: 2005-12-05 14:00:33 *****

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

ali

ali
  • Full Members
  • 1,008 posts

Posted 05 December 2005 - 14:15

hast du mit /L*V geloggt? hst du mal nach PATCH im log gesucht? das ist seltsam!
eigentlich werden dort alle Propertys die im MSI Projekt verwendet werden wieder gesetzt!

Edited by ali, 05 December 2005 - 14:16.


ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 14:22

Ich bin auf Erstellen->Einstellungen->MSI-Logdatei udn habe bei Protokolldateo "/L*V" reingeschrieben, alles neu kompiliert, den Patch neu erstellt und dann laufen lassen.

ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 14:23

patch.msp?? Ich habe eine update.exe, viel mehr is da nicht

ali

ali
  • Full Members
  • 1,008 posts

Posted 05 December 2005 - 14:29

versuchs mit
Update.exe /v"/L*V <pfad>patch.log"

ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 14:50

ok das funzt, da kommt schon ein bisschen sehr viel mehr

ronkub

ronkub
  • Members
  • 14 posts

Posted 05 December 2005 - 14:55

ok wenn ich noch ein letzte mal nerven darf: hast du nen kleinen Beispielcode wie ich im Msi-Script die MsiGetProperty ausführen muss? Mit Variablendeklaration?
Das wär nett, und dann krieg ich das schon irgendwie hin.

ali

ali
  • Full Members
  • 1,008 posts

Posted 06 December 2005 - 10:48

function SetCobolDir (hMSI)
string svCblDir;
number nvCount;
begin
MsiGetProperty(hMSI,"TEST",svCblDir,nvCount);
StrRemoveLastSlash ( svCblDir );
MsiSetProperty (hMSI,"TEST",svCblDir );
end;

ronkub

ronkub
  • Members
  • 14 posts

Posted 08 December 2005 - 08:58

großes THX an dich ALI; das funzt jetzt soweit smile.gif

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 08 December 2005 - 22:18

nvCount sollte vor MsiGetProperty initialisiert werden, denn es gibt die verfügbare Puffergröße an.