AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programm in Win11 Startmenü eintragen

Ein Thema von dpKlaus · begonnen am 8. Feb 2025 · letzter Beitrag vom 10. Feb 2025
Antwort Antwort
dpKlaus

Registriert seit: 1. Nov 2020
17 Beiträge
 
#1

Programm in Win11 Startmenü eintragen

  Alt 8. Feb 2025, 14:59
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.788 Beiträge
 
Delphi 12 Athens
 
#2

AW: Programm in Win11 Startmenü eintragen

  Alt 8. Feb 2025, 19:45
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
dpKlaus

Registriert seit: 1. Nov 2020
17 Beiträge
 
#3

AW: Programm in Win11 Startmenü eintragen

  Alt 9. Feb 2025, 00:45
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.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
975 Beiträge
 
Delphi 6 Professional
 
#4

AW: Programm in Win11 Startmenü eintragen

  Alt 9. Feb 2025, 19:20
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...
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
dpKlaus

Registriert seit: 1. Nov 2020
17 Beiträge
 
#5

AW: Programm in Win11 Startmenü eintragen

  Alt 10. Feb 2025, 15:51
Vielen Dank für die Hilfe.
Es funktioniert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.287 Beiträge
 
Delphi 12 Athens
 
#6

AW: Programm in Win11 Startmenü eintragen

  Alt 10. Feb 2025, 17:45
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]
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Feb 2025 um 17:51 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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 by Thomas Breitkreuz