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