Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Windows 11 Desktop-Shortcut erstellen

  Alt 23. Jan 2024, 22:49
ALinkDestination ist wirklich ein Pfad, inkl. abschließendem \ ?
Delphi-Referenz durchsuchenTPath.Combine


Stell dir mal vor, jemand würde die Rückgabewerte wirklich auswerten, dann wüsste derjenige*innen vermutlich was, ob und warum es nicht ginge.

Delphi-Quellcode:
uses Winapi.ShlObj, Winapi.Ole2, System.Win.ComObj;

procedure CreateLink(const AFileName, ALinkFileName, AParameter, ALinkDestination: string);
var
  res: HRESULT;
  psl: IShellLink;
  ppf: IPersistFile;
begin
  res := CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_inPROC_SERVER, IID_IShellLinkW, psl);
  if Succeeded(res) then begin
    psl.SetPath(PChar(AFileName));
    psl.SetArguments(PChar(AParameter));
    psl.SetWorkingDirectory(PChar(ExtractFileDir(AFileName)));
    res := psl.QueryInterface(IID_IPersistFile, ppf);
    if Succeeded(res) then
      ppf.Save(PChar(ALinkDestination + ALinkFileName + '.lnk'), True)
    else
      RaiseLastOSError(res);
  end else
    RaiseLastOSError(res);
end;
oder gleich ganz (denn ALLE deine genutzten Funktionen besitzen ein Result, was oft komplett ignoriert wird)
und da ich jetzt mal faul bin ...
Delphi-Quellcode:
procedure CreateLink(const AFileName, ALinkFileName, AParameter, ALinkDestination: string);
var
  psl: IShellLink;
  ppf: IPersistFile;
begin
  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_inPROC_SERVER, IID_IShellLinkW, psl));
  OleCheck(psl.SetPath(PChar(AFileName)));
  OleCheck(psl.SetArguments(PChar(AParameter)));
  OleCheck(psl.SetWorkingDirectory(PChar(ExtractFileDir(AFileName))));
  OleCheck(psl.QueryInterface(IID_IPersistFile, ppf));
  OleCheck(ppf.Save(PChar(ALinkDestination + ALinkFileName + '.lnk'), True));
end;
Delphi-Referenz durchsuchenOleCheck (ErrorBit) oder doch vielleicht Delphi-Referenz durchsuchenCheckOSError (ungleich 0 aka S_OK);

Aber beim RaiseLastOSError(res, 'nochwas') oder raise Exception.Create('sonstwas: ' + SysErrorMessage(Cardinal(res))); hätte man noch einen Bonus.
noch (vielleicht), da https://quality.embarcadero.com/browse/RSP-44293
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (23. Jan 2024 um 23:49 Uhr)
  Mit Zitat antworten Zitat