Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Programm in Win11 Startmenü eintragen (https://www.delphipraxis.net/216673-programm-win11-startmenue-eintragen.html)

dpKlaus 8. Feb 2025 14:59

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

jaenicke 8. Feb 2025 19:45

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.

dpKlaus 9. Feb 2025 00:45

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.

HolgerX 9. Feb 2025 19:20

AW: Programm in Win11 Startmenü eintragen
 
Hmm...

bei Unicode-Delphi ist PChar ein PWideChar..

Zitat:

Code:
if SUCCEEDED(CoCreateInstance(CLSID_ShellLink,nil,CLS CTX_INPROC_SERVER, IID_IShellLinkA, psl)) then

Hier holst Du aber per IID_IShellLinkA eine Ansi Version...

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... ;)

dpKlaus 10. Feb 2025 15:51

AW: Programm in Win11 Startmenü eintragen
 
Vielen Dank für die Hilfe.
Es funktioniert. :thumb:

himitsu 10. Feb 2025 17:45

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