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

Property über CustomAction InstallScript auslesen


6 replies to this topic

MadCap

MadCap
  • Full Members
  • 8 posts

Posted 13 February 2007 - 14:16

Hallo,

ich habe es schon mit der Suchfunktion probiert, aber nix gefunden. Ich verwende InstallShield 11 Premier habe die Aufgabe ein Basic MSI zu erstellen, was eine Verteilung über Gruppenrichtlinie ermöglichen soll. Da dies mein erstes Setup ist, bin ich noch nicht so gut vertraut mit IS11.

Das Problem hierbei ist, dass ich Daten die der Nutzer am Schluss des Setups in ein Textfeld eingibt, über eine CustomAction, welche eine Funkion Convert() aus InstallScript.rul aufruft, aus der [Property] des Textfeldes benötige. Dazu wollte ich

MsiGetProperty(ISMSI_HANDLE, "DI_USERNAME", svUsername, nvUsernameBuffer)

verwenden. Das Haken ist, ich brauche das Handle, nur ISMSI_HANDLE ist laut Hilfe nicht in Basic MSI verfügbar.
Gibt es irgendeine Möglichkeit in einem Basic MSI, eine Property in einem Installscript.rul abzufragen und wieder zu setzen(MsiSetProperty())?

Der Name soll nach der Eingabe konvertiert werden, damit ich ich ihn als Parameter an eine *.exe übergeben kann, welche nur diesen konvertierten String annimmt. Eine Standard-DLL wollte ich nicht erst für eine einzige Funktion bauen, womit man ja recht problemlos auf Properties zugreifen kann.

Gruss Mad

ali

ali
  • Full Members
  • 1,008 posts

Posted 13 February 2007 - 14:58

wenn du nicht mit dem Property direkt über ein CA arbeiten kannst, dann kannst du die Property in einem Script so abfragen:

MsiGetProperty(hMSI,"DI_USERNAME", svUsername, nvUsernameBuffer);

MsiSetProperty(hMSI,"DI_USERNAME",svName);

ALI


MadCap

MadCap
  • Full Members
  • 8 posts

Posted 13 February 2007 - 16:14

woher bekomme ich aber das Handle hMSI her? Dieses wird doch von oben als formaler Parameter per Value übergeben.

zB.

export prototype convert(BYVAL HWND);
function convert(hMSI)
...
begin
...
end

ohne das Handle stürzt bzw. bricht das Setup ab. Deswegen wollte ich die globale Variable nehmen, die InstallShield bietet.

In der Hilfe steht:

Most Windows Installer API functions take a handle to the currently running database as an argument. For an InstallScript custom action, the database handle is the HWND argument passed to the custom action. In an event-handler function, you can use the global variable ISMSI_HANDLE, which stores the handle to the running .msi database.

Der letzte Satz ist der entscheidende Punkt, ich brauche das Handle dieser running .msi .

Oder hab ich dich falsch verstanden ? Mir ist nicht so ganz klar wo ich ein Handle herbekomme. Wo würdest du das hMSI erhalten, speziell mit den Möglichkeiten von Basic MSI?

Ach und das steht unter der globalen Variablen ISMSI_HANDLE in der Hilfe:

ISMSI_HANDLE is not supported in Basic MSI projects, and is not supported in InstallScript custom actions.

Ich bin mittlerweile von der Lösung, das vorgefertigte InstallScript zu nutzen weggegangen und nutze stattdessen ein im Anschluss gestartete .exe, die mir seitens der Firma noch zur Verfügung gestellt wird, aber ich wäre trotzdem über jeden Hinweis dankbar, der mir bei meiner ersten Variante weiterhelfen könnte.

Gruss Mad

ali

ali
  • Full Members
  • 1,008 posts

Posted 14 February 2007 - 09:03

ich verstehe nicht ganz was du willst, bekommst du fehler beim kompilieren des scriptes? Vielleicht fehlt dir ein include. Ich verwende MsiGetProperty in mehreren Funktionen im installscript und habe keinerlei probleme damit.

Edited by ali, 14 February 2007 - 09:05.


MadCap

MadCap
  • Full Members
  • 8 posts

Posted 14 February 2007 - 15:43

Sobald das Setup an die Stelle kommt mit dem Script, bricht das Setup ab. Woher nimmst du das Handle für MsiGetProperty() ? Ich habe noch keinerlei Erfahrung mit Installscript, von daher ist mir das ein Rätsel. In C++ muss ich ein Handle mir vorher geben lassen durch irgendeine API-Funktion(zB. hHandle = LoadLibrary(...) ), aber wo kommt das Handle für MsiGetProperty her ?
Einbinden tuh ich in eigentlich nur:
#include "ifx.h"
#include "meinScript.rul"

... benutzt du noch eine Funktion wie MsiOpenPackage() um das Handle zu erhalten ?

ali

ali
  • Full Members
  • 1,008 posts

Posted 14 February 2007 - 15:56

laut meiner Hilfe benötigt man das nicht zum Festlegen eines Propertys. Ich habe zwar in der InstallScript Hilfe für Installscript Projekte gesehen das man eine MSIHANDLE machen muss, aber bei meiner Hilfe für Basic MSI benötigt man das einbinden von

#include "ifx.h"
#include "isrt.h"
#include "iswi.h"

danch arbeite ich weiter mit

export prototype Beispiel(HWND];

funktion Beisbiel(hMSI);
...
begin
MsiGetProperty(...);
end;

danach meine InstallScript CA, rein in die Sequenzen und das geht.

Edited by ali, 14 February 2007 - 15:58.


MadCap

MadCap
  • Full Members
  • 8 posts

Posted 15 February 2007 - 11:24

U DA MAN !

Danke, das funktioniert, mir ist zwar immer noch ein Rätsel wie IS11 das Handle aus der Luft greift, aber egal.
Jetzt kann ich das doch noch einbauen, das Ganze soll dem Nutzer nur ersparen nach der Installation eine .exe auszuführen, muss er zwar später trozdem, aber in Sachen Usability kann man es dem OttoNormal-Nutzer dadurch halt bequemer machen(so eine Art Erst-Initialisierung) ... und erspart sich evtl ein paar 'überflüssige' Supportanfragen.

Gruss Mad