RunOnce Registry Einträge

JJB

Cogito ergo brumm
Tachtach !

Ich muß ein Installationsprogramm schreiben, welches diverse Komponenten auf dem Rechner installiert. Zwischen den Komponenten muß ein Neustart erfolgen. Das heißt ich muß nach dem Neustart an einer bestimtmen Stelle im Code ansetzen.
Ich dachte mir, ich setze einen Runonce Eintrag in der Registry und mit dem Verweise auf das Installationsprogramm und einem Parameter. Dieser Parameter gibt mir an an welcher Stelle ich fortsetze.
Nun...
Wie kann ich einen derartigen Verweis in der Registry einrichten, dass ich beim Anmelden gleich wieder im Programm bin und meinen Parameter dabei habe ?

Jemand einen Tip ?

MFG JJB

_
 
Wie du einen RegistryKey setzt setze ich mal als bekannt voraus. Dann geht es eigentlich nur darum, den richtigen Key zu finden:

HKEY_LOCALMACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce

Einfach einen String-Schlüssel anlegen (Typ REG_SZ) und als String den ABSOLUTEN (mit kompletten Pfad) Pfad zu deiner .exe (vorsichtshalber Anführungszeichen um den ganzen Pfad, könnten Spaces mit drin sein) und die Parameter direkt hinten dran (die nicht mit in die Anführungszeichen).

Windows macht dann den Rest (es sei denn, das Setup hat Windows kaputtgemacht :D )

Nachtrag: Mit den RegistryKeys muss man wegen den Benutzerrechten aufpassen, ein Gast-User darf ja eigentlich gar nix und normale User haben auch nicht alle Zugriffsrechte. Eventuell muss dein Setup auf Admin-Rechten bestehen (ist aber normal).
 
Soweit Danke !

Allerdings weiß ich nicht, wie man RegistryKeys setzt. Ich hab von C++ nicht so die Ahnung. Ich weiß nicht inwiefern es sich zu C# unterscheidet.

MFG JJB

_
 
Da sind die Unterschiede recht klein, unter C++ ist es wahrscheinlich nur ein Stückchen komplizierter. Hier mal einfach ein Code-Snippet, leider hässlich mit const char*, aber sollte reichen:

Code:
bool CRegistryHelper::SetKey( HKEY hKeyMain, const char* szBranch, const char* szKey, const char* szValue )
{

  HKEY          hkeySub;

  DWORD         dwSize;


  if ( RegOpenKeyEx( hKeyMain, szBranch, 0, KEY_SET_VALUE, &hkeySub ) != ERROR_SUCCESS )
  {
    if ( RegCreateKeyEx( hKeyMain, szBranch, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS | KEY_SET_VALUE, NULL, &hkeySub, &dwSize ) != ERROR_SUCCESS )
    {
      return false;
    }
  }
  dwSize = 512;
  if ( RegSetValueEx( hkeySub, szKey, 0, REG_SZ, (BYTE*)szValue, (DWORD)strlen( szValue ) ) != ERROR_SUCCESS )
  {
    RegCloseKey( hkeySub );
    return false;
  }

  RegCloseKey( hkeySub );

  return true;

}

Der Aufruf sollte so aussehen:

CRegistryHelper::SetKey( HKEY_LOCALMACHINE, "Software\Microsoft\Windows\CurrentVersion\RunOnce", "MeinProgramm", "c:\\programme\\woauchimmer\\abernichthier\\meinprogramm.exe -einparameter" );

Bei deinem Pfad solltest du da zusätzlich Anführungszeichen drumrum machen, besonders, wenn den der User einstellen darf. Würde so aussehen:
CRegistryHelper::SetKey( HKEY_LOCALMACHINE, "Software\Microsoft\Windows\CurrentVersion\RunOnce", "MeinProgramm", "\"c:\\programme\\woauchimmer\\abernichthier\\meinprogramm.exe\" -einparameter" );
 
Dieser RunOnce Eintrag bewirkt gar nichts...
Er steht drin und bleibt da auch. Er wird weder ausgeführt, noch wird er danach gelöscht.
Was stimmt da nicht ? Ist es der falsche Ansatz ?

MFG JJB

_


Fehler gefunden !
Das Setupprogramm wird fortgesetzt, doch noch bevor Windows vollständig geladen ist. XP meldet jetzt einen Fehler, dass Systemkomponenten nur mit der Systemsteuerung installiert werden können. Dieser Fehler tritt nicht auf, wenn das Setupprogramm in Windows gestartet wird.

Gibt es eine Möglichkeit den RunOnce Eintrag so zu verzögern, dass er wartet bis sämtliche Komponenten (z.B. CD-RAM) geladen sind ?
Gibt es da vielleicht noch andere Einträge ?

MFG JJB
_
 
Zuletzt bearbeitet:
Hmm, da ich selber mit dem RunOnce nur mal experimentiert habe, kann ich dazu nicht viel mehr sagen.
Was ich aber kenne, du kannst beim lokalen User HKEY_CURRENT_USER statt RunOnce den Run-Key nehmen (HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run). Der Key wird erst aufgerufen, wenn sich der User anmeldet. In dem Fall müssen ja die Treiber usw. alle schon geladen sein. Einen Run-Key musst du dann allerdings selbst wieder rauslöschen, der bleibt ja.
 
Bei Current User reagiert er weder auf RunOnce noch auf Run.
Bei Lokal Machine reagiert er nur auf RunOnce. Und da gibt es dann den Fehler, da er das Setup wieder startet, bevor alle Komponenten initialisiert und die Daten einlesbar sind.
So komme ich nicht auf die CD.

Ich brauche einen Aufruf, der nach dem Starten des Profils und dem Initialisieren der CD, das Setup erneut aufruft. tja... jetzt steck ich irgendwie fest.

Tips.... ?

MFG JJB
_
 
Wie wäre es einfach im Autostart-Ordner? Achtung, der Name des Ordners ist sprachenabhängig, also den Namen des StartUp-Ordner zuerst aus der Registry holen.
Der komplette Pfad des Ordners ist über HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Folders und dem Key "Startup" zu holen. Es reicht, dort eine Verknüpfung zu deinem Setup anzulegen (oder eine .exe die dein Setup startet).

Alternativ die Shell-Funktion SHGetSpecialFolderLocation benutzen (umständlich, weil muss noch die PIDL in einen String umwandeln), alternativ SHGetSpecialFolderPath (braucht aber IE 4.0 installiert).


Moral: Setups sind höllisch, wenn man sie halbwegs fehlerlos hinkriegen will.
 
Was genau willst du eigentlich installieren?
Evtl. solltest du dir eine freie Setuplösung nehmen (Nullsoft-Installer, ...) Da gibt es Funktionailitäten, die das Ganze für dich erledigen.

Daniel
 
Nun, ich habe das Problem, dass mein Abteilungsleiter das ganze so universell einsetzbar wie möglich haben will. Keine Fehler mit .Net, keine DLL Fragen, keine lokalen Verzeichnisse, keine manuellen Dateischiebereien. Einfach nur ein externes Setupprogramm, und der Zugriff auf die Registry.

Ich benutze Inno Setup und generiere dynamische Skripte zur Setuperstellung. Registryeinträge kann ich problemlos hinzufügen.
Von daher werde ich versuchen den Autostartordner über die Registry zu ermitteln. Ist immerhin die Registry beteiligt, so sollte es auch Systemübergreifend funktionieren. Wenn das klappt sollte ich das vertreten können.

Danke erstmal.

MFG JJB
_
 

Neue Beiträge

Zurück