Announcement

Collapse
No announcement yet.

Verknüpfung und Startmenü-Eintrag für alle User erzeugen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verknüpfung und Startmenü-Eintrag für alle User erzeugen

    Ich möchte via Delphi-Programm einen Eintrag im Startmenü und eine Verknüpfung auf dem Desktop erzeugen. Allerdings für alle Benutzer.

    Wenn man ein bißchen "googled" stößt man immer wieder auf die Funktion CreateLink(). Es sind versch. Varianten im Umlauf, die sich letztendlich aber nur in der Benennung der Parameter unterscheiden. Nun ja, damit mache ich das. Aber leider nur für den aktuellen Benutzer. Mein Problem ist, dass ich im Quellcode der Methode "ums Verrecken" nicht erkennen kann, an welchem Schräubchen ich drehen müßte, dass das zu erzeugende Objekt für alle Benutzer angelegt wird.

    Funktionieren soll's außerdem unter allen Windows-Versionen von 98 an aufwärts. Wer weiß Rat?

    Gruß

    Wolfgang

  • #2
    Ich nehme an, du speicherst den Link unter "User-Ordner\Startmenü"?
    probiers ma mit "All Users\Startmenü"

    Gruß, Christian
    If it's there and you can see it – it's REAL
    If it's there and you can't see it – it's TRANSPARENT
    If it's not there and you can see it – it's VIRTUAL
    If it's not there and you can't see it – it's GONE!

    Comment


    • #3
      Hallo,

      ich hab's gelöst. Dass die Verknüpfung im falschen Ordner gelandet ist, war mir schon klar. Ich wußte nur nicht wie ich die Funktion CreateLink dazu bringen sollte, den All Users-Ordner zu verwenden.

      (Ich benutze die Funktion CreateLink nicht mehr.) Ich lasse mir jetzt den Ordner-Namen aus der Registry geben und hoffe, dass das dann bei allen Windows-Versionen funktioniert.

      Falls jemand mal ein ähnliches Problem hat hier der Code zum Erzeugen eines Menü-Eintrags unter Start/Programme. (Direkter Eintrag, keine neue Gruppe.):

      procedure InsProgrammMenue(Datei, Name, WorkingDir: String);
      var Shortcut: IUnknown;
      SLink: IShellLink;
      PFile: IPersistFile;
      Wdatei: WideString;
      Reg: TRegistry;
      dir: string;
      begin
      shortCut := CreateComObject(CLSID_ShellLink);
      SLink := ShortCut as IShellLink;
      PFile := ShortCut as IPersistFile;
      SLink.SetArguments('');
      SLink.SetPath(Pchar(Datei));
      SLink.SetWorkingDirectory(PChar(WorkingDir));

      Reg := TRegistry.Create();
      try
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      if Reg.OpenKey('Software\Microsoft\Windows\CurrentVer sion\Explorer\Shell Folders', False) then begin
      Dir := Reg.ReadString('Common Programs');
      WDatei := Dir + '\'+ Name + '.Lnk';
      PFile.Save(PWChar(Wdatei), False);
      end;
      finally
      Reg.CloseKey;
      Reg.Free;
      end;
      end;

      Gruß

      Wolfgan

      Comment


      • #4
        es geht auch ein "offizieller" M$-Weg, eben nicht aus der Registry holen, sondern mit Funktionen. Hier eine Fuktion dazu, die einige besondere Verzeichnisse ausliest:
        Code:
        function GetFileFromCSIDL(i: Longint): string;
          var
            path: string;
          begin
            SetLength(path, 250);
            if (i = CSIDL_ADMINTOOLS) or
              (i = CSIDL_COMMON_ADMINTOOLS) or
              (i = CSIDL_APPDATA) or
              (i = CSIDL_COMMON_APPDATA) or
              (i = CSIDL_COMMON_DOCUMENTS) or
              (i = CSIDL_COOKIES) or
              (i = CSIDL_FLAG_CREATE) or
              (i = CSIDL_HISTORY) or
              (i = CSIDL_INTERNET_CACHE) or
              (i = CSIDL_LOCAL_APPDATA) or
              (i = CSIDL_MYPICTURES) or
              (i = CSIDL_PERSONAL) or
              (i = CSIDL_PROGRAM_FILES) or
              (i = CSIDL_PROGRAM_FILES_COMMON) or
              (i = CSIDL_SYSTEM) or
              (i = CSIDL_RECENT) or
              (i = CSIDL_WINDOWS) or
              (i = CSIDL_FLAG_DONT_VERIFY ) then begin
              SHGetSpecialFolderPath(Application.Handle, PChar(path), i, False );
              if pos(#0,path)>0 then
                path := copy(path,1,pos(#0,path)-1);
              result := path;
            end else begin
              Result := '';
            end;
        Ich hoffe, das hilft

        Comment

        Working...
        X