![]() |
Programm in Win11 Startmenü eintragen
Guten Tag,
ich versuche ein Programm in das Win11 Startmenue einzutragen. Dazu nutze ich einen Funktionsaufruf der in Win10 noch funktionierte: unit WinStartMenu; interface {uses Windows, ShlObj, SysUtils, ...} // uses // windows, ShlObj, SysUtils, Registry, ComObj, ActiveX; uses Windows, SysUtils, Dialogs; // Function CreateFolder(Foldername:string):boolean; // function CreateLink(lpszPathObj,lpszPathLink,lpszDesc:strin g):Boolean; procedure ErzeugeWinStartMenu; implementation {$IFDEF VER90} uses OLE2, ComObj, ShlObj; {$ELSE} uses ActiveX, ComObj, ShlObj; {$ENDIF} const IID_IPersistFile : TGUID=(D1:$0000010B;D2:$0000;D3:$0000;D4:($C0,$00, $00,$00,$00,$00,$00,$46)); function SpecialDirectory(ID:integer):string; var pidl : PItemIDList; Path : PChar; begin if SUCCEEDED(SHGetSpecialFolderLocation(0,ID,pidl)) then begin Path:=StrAlloc(max_path); SHGetPathFromIDList(pidl,Path); Result:=String(Path); if Result[length(Result)]<>'\' then Result:=Result+'\'; end; end; {SpecialDirectory} Function CreateFolder(Foldername:string):boolean; begin Result:=false; SetLastError(0); CreateDirectory(PChar(Foldername), nil ); if (GetLastError()=0) or (GetLastError()=ERROR_ALREADY_EXISTS) then Result:=true; end; {CreateFolder} function CreateLink(lpszPathObj,lpszPathLink,lpszDesc:strin g):Boolean; var psl : IShellLink; ppf : IPersistFile; begin Result:=false; if SUCCEEDED(CoCreateInstance(CLSID_ShellLink,nil,CLS CTX_INPROC_SERVER, IID_IShellLinkA, psl)) then begin psl.SetPath(PChar(lpszPathObj)); psl.SetDescription(PChar(lpszDesc)); psl.SetWorkingDirectory(PChar (ExtractFilePath (lpszPathObj))); if SUCCEEDED(psl.QueryInterface(IID_IPersistFile,ppf) ) then begin ppf.Save(StringToOLEStr(lpszPathLink),TRUE); Result:=true; end; end; end; {CreateLink} // ************************************************** ******************** // Eintrag im WinStartMenue // ************************************************** ******************** procedure ErzeugeWinStartMenu; begin CreateFolder(SpecialDirectory(CSIDL_Programs)+'Neu '); // ->Erstellt die Programmgruppe "Neu" im Programs-Menü. CreateLink('C:\neu\Programm.exe',SpecialDirectory( CSIDL_Programs)+'neu\'+'Programm.lnk','Programm'); // ->Erstellt einen Link mit dem Titel "Programm" auf die Datei "C:\Test\Programm.exe" // in der Programs-Gruppe. end; Wenn ich ErzeugeWinStartMenu aufrufe landet "Programm", also die Verknüpfung zu Programm.exe, im StartMenu unter "P". Der Ordner "NEU" wird im StartMenu nicht angezeigt. Was hat sich da geändert, bzw. was mache ich falsch??? Viele Grüße |
AW: Programm in Win11 Startmenü eintragen
Um keine nervenden Ordner mit nur einem Eintrag zu haben, wird der einzige Eintrag einfach automatisch direkt angezeigt. Wenn da mehr Einträge drin sind, sollte der Ordner sichtbar sein.
|
AW: Programm in Win11 Startmenü eintragen
Vielen Dank für den Hinweis. Es klappt bei zwei Programmen.
Ich hab aber wohl noch ein Problem bei der Function "CreateLink". Da habe ich keine ordentliche Verknüpfung. Zwar stehen die beiden "Verknüpfungen" in einem Ordner des StartMenues aber es gibt keinen Bezug zu den zu startenden Programmen. Ich glaube hier liegt ein Problem bei den Strings. |
AW: Programm in Win11 Startmenü eintragen
Hmm...
bei Unicode-Delphi ist PChar ein PWideChar.. Zitat:
Sollte dass dann nicht IID_IShellLinkW sein und explizit PWideChar statt PChar verwenden? Besser mit strickten Typen (WideString / IShellLinkW / PWideChar / IID_IShellLinkW) arbeiten, dann gibt es auch keine Verwechslung... ;) |
AW: Programm in Win11 Startmenü eintragen
Vielen Dank für die Hilfe.
Es funktioniert. :thumb: |
AW: Programm in Win11 Startmenü eintragen
Nunja, der Code ist sooooooooo alt, noch lange vor Delphi 2009 (so, wie es aussieht).
Dabei ist es doch eigentlich ganz einfach: IID_IShellLinkA, IShellLinkA, PAnsiChar und AnsiString IID_IShellLinkW, IShellLinkW, PWideChar und WideString/UnicodeString IID_IShellLink, IShellLink, PChar und String Dann noch das andere Problem, eine total nutzlose Fehlerbehandlung, welche nur ein Boolean zurückliefert, anstatt der eigentlichen Fehlerinformation (Fehlercode/-text), so dass niemand hören konnte, warum es nicht geht, und zusätzlich auch noch diese nichtssagende Info komplett ignoriert. (Result nicht ausgewertet) PS: [DELPHI] dein Code [/DELPHI] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz