ALinkDestination ist wirklich ein Pfad, inkl. abschließendem \ ?
TPath.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;
OleCheck (ErrorBit) oder doch vielleicht
CheckOSError (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