Der Code ist seit Jahren bei uns erfolgreich im Einsatz, allerdings füllen wir die Parameter zufällig auch richtig.
Als LinkFilename wird da das Ergebnis eines SaveDialogs reingegeben, welcher nur korrekte Dateinamen in existierenden Pfaden mit Schreibrechten raus gibt. :stipid:
CreateLinkFile('D:\Anfragen\9220\16248\Angebot.lnk', 'D:\Anfragen\9220\Angebot', '', '');
D:\Anfragen\9220\
16248 ist ein Verzeichnis und keinen Dateiname?
Wenn ja, dann knallt es im PersistFile.Save mit Zugriff verweigert, was leider nicht ausgewertet wurde.
Delphi-Quellcode:
procedure CreateLinkFile(LinkFilename, Filename, Args, Description: string);
procedure Check(H: HResult);
begin
if not Succeeded(H) then
RaiseLastOSError(H);
end;
var
ShellLink: IShellLink;
PersistFile: IPersistFile;
begin
Check(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IID_IShellLink, ShellLink));
Check(ShellLink.SetPath(PChar(Filename)));
Check(ShellLink.SetArguments(PChar(Args)));
Check(ShellLink.SetDescription(PChar(Description)));
Check(ShellLink.SetWorkingDirectory(PChar(ExtractFilePath(Filename))));
Check(ShellLink.QueryInterface(IPersistFile, PersistFile));
Check(PersistFile.Save(PChar(LinkFilename), True));
end;