Windows Installer - MsiGetProperty

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Chrono
Beiträge: 6
Registriert: 28.12.2004 14:31

Windows Installer - MsiGetProperty

Beitrag von Chrono »

Hi Leute,

kann mir mal irgendeiner einen Tipp geben, wie ich den folgenden C++ Code nach PureBasic umschreiben kann:

Code: Alles auswählen

UINT __stdcall ValidateSerial_Sample(MSIHANDLE hInstall) 
{
  TCHAR szPidKey[PIDKEY_LENGTH]; 
  DWORD dwLen = sizeof(szPidKey)/sizeof(szPidKey[0]); 
  //retrive the text entered by the user 
  UINT res = MsiGetProperty(hInstall, _T("PIDKEY"), szPidKey, &dwLen); 
  if(res != ERROR_SUCCESS) 
  {
    //fail the installation 
    return 1; 
  }
  bool snIsValid = false; 
  //validate the text from szPidKey according to your algorithm 
  //put the result in snIsValid 
  TCHAR * serialValid; 
  if(snIsValid) 
    serialValid = _T("TRUE"); 
  else 
  {
    //eventually say something to the user 
    MessageBox(0, _T("Invalid Serial Number"), _T("Message"), MB_ICONSTOP); 
    serialValid = _T("FALSE"); 
  }
  res = MsiSetProperty(hInstall, _T("SERIAL_VALIDATION"), serialValid); 
  if(res != ERROR_SUCCESS) 
  {
    return 1; 
  } 
  //the validation succeeded - even the serial is wrong 
  //if the SERIAL_VALIDATION was set to FALSE the installation 
  //willl not continue 
  return 0; 
}
Das ganze wird als DLL in eine Windows Installer installation eingebaut (zum überprüfen einer Seriennummer), allerdings bricht der Installer immer beim Aufruf von MsiGetProperty ab...

Da ich nicht wirklich Ahnung von C++ habe hoffe ich mal das mir hier einer weiterhelfen kann :roll:

Danke schonmal im vorraus!
Gruss

Chrono aka Alex
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

so vielleicht? (ka obs richtig ist)

Code: Alles auswählen

Procedure.l ValidateSerial_Sample(hInstall.l)
  szPidKey.s = Space(#PIDKEY_LENGTH)
  dwLen = #PIDKEY_LENGTH
  res = MsiGetProperty_(hInstall, _T("PIDKEY"), szPidKey, @dwLen)
  If res <> #ERROR_SUCCESS
    ProcedureReturn 1
  EndIf
  snIsValid = #False
  
  *serialValid.STRING 
  If snIsValid
    *serialValid = @_T("TRUE")
  Else 
    MessageBox_(0, _T("Invalid Serial Number"), _T("Message"), MB_ICONSTOP)
    *serialValid = @_T("FALSE")
  EndIf
  res = MsiSetProperty_(hInstall, _T("SERIAL_VALIDATION"), serialValid)
  If res <> #ERROR_SUCCESS
    ProcedureReturn 1
  EndIf
  ProcedureReturn 0
EndProcedure
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Chrono
Beiträge: 6
Registriert: 28.12.2004 14:31

Beitrag von Chrono »

Ganz so einfach ist das leider nicht ;)

#PIDKEY_LENGTH gibt's schonmal nicht und was das _T("...") sein soll weiss ich auch nicht... :|
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Chrono hat geschrieben:Ganz so einfach ist das leider nicht ;)

#PIDKEY_LENGTH gibt's schonmal nicht und was das _T("...") sein soll weiss ich auch nicht... :|
PIDKEY_LENGHT ist ja auch im C++-Code nicht definiert... Wie sollen wir es denn hier definieren?!

Und wenn Du mal nach MsiGetProperty googelst findest Du die Parameter, die erwartet werden und kannst erkennen, welchen Typ _T hat:

Code: Alles auswählen

UINT MsiGetProperty(
  MSIHANDLE hInstall,
  LPCTSTR szName,
  LPTSTR szValueBuf,
  DWORD* pchValueBuf
);
Laß also einfach alle _T's weg, es handelt sich um nullterminierte Strings:

Code: Alles auswählen

Procedure.l ValidateSerial_Sample(hInstall.l) 
  #PIDKEY_LENGTH = 256
  szPidKey.s = Space(#PIDKEY_LENGTH) 
  dwLen = #PIDKEY_LENGTH
  res = MsiGetProperty_(hInstall, "PIDKEY", szPidKey, @dwLen) 
  If res <> #ERROR_SUCCESS 
    ProcedureReturn 1 
  EndIf 
  snIsValid = #False 
  
  *serialValid.STRING 
  If snIsValid 
    *serialValid = @"TRUE" 
  Else 
    MessageBox_(0, "Invalid Serial Number", "Message", MB_ICONSTOP) 
    *serialValid = @"FALSE" 
  EndIf 
  res = MsiSetProperty_(hInstall, "SERIAL_VALIDATION", serialValid) 
  If res <> #ERROR_SUCCESS 
    ProcedureReturn 1 
  EndIf 
  ProcedureReturn 0 
EndProcedure
Chrono
Beiträge: 6
Registriert: 28.12.2004 14:31

Beitrag von Chrono »

Vielen Dank für den Code! :allright:

Ein kleiner Fehler ist noch im Code! Die Zeile mit MsiSetProperty muss folgendermasen lauten:

Code: Alles auswählen

  res = MsiSetProperty_(hInstall, "SERIAL_VALIDATION", *serialValid) 
Vielleicht kann ja noch einer den Code brauchen :)
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Da is noch'n kleiner Fehler drin, vor MB_ICONSTOP fehlt die Raute:

Code: Alles auswählen

Procedure.l ValidateSerial_Sample(hInstall.l) 
  #PIDKEY_LENGTH = 256 
  szPidKey.s = Space(#PIDKEY_LENGTH) 
  dwLen = #PIDKEY_LENGTH 
  res = MsiGetProperty_(hInstall, "PIDKEY", szPidKey, @dwLen) 
  If res <> #ERROR_SUCCESS 
    ProcedureReturn 1 
  EndIf 
  snIsValid = #False 
  
  *serialValid.STRING 
  If snIsValid 
    *serialValid = @"TRUE" 
  Else 
    MessageBox_(0, "Invalid Serial Number", "Message", #MB_ICONSTOP) 
    *serialValid = @"FALSE" 
  EndIf 
  res = MsiSetProperty_(hInstall, "SERIAL_VALIDATION", *serialValid) 
  If res <> #ERROR_SUCCESS 
    ProcedureReturn 1 
  EndIf 
  ProcedureReturn 0 
EndProcedure
Was mich aber schon die ganze Zeit wundert, warum schreibt man zuerst "snIsValid = #False" und danach "If snIsValid" wenn das doch niemals eintreten kann ~_~

Was macht der Code überhaupt...?
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Chrono
Beiträge: 6
Registriert: 28.12.2004 14:31

Beitrag von Chrono »

Da fehlen ja auch die Kommentare vom C++ Beispiel ;)
Mittendrin würde nämlich eine Überprüfung der Seriennummer folgen!

Das ganze brauch ich um eine Dll zur Seriennummerprüfung für den Advanced Installer zu basteln.

Der erstellt MSI Installationen und ist (je nach funktionsumfang) sogar Freeware <)

Und ich probier eben momentan ein bisschen mit dem Installer rum :lol:
Antworten