Seite 1 von 1

Windows Installer - MsiGetProperty

Verfasst: 28.12.2004 14:36
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

Verfasst: 28.12.2004 17:23
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

Verfasst: 28.12.2004 18:31
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... :|

Verfasst: 28.12.2004 20:28
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

Verfasst: 29.12.2004 10:12
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 :)

Verfasst: 29.12.2004 14:39
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...?

Verfasst: 29.12.2004 14:50
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: