IShellLink.SetPath() Problem

Antworten
compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

IShellLink.SetPath() Problem

Beitrag von compmgmt »

Hi,

ich verwende den folgenden Code in einer Win32-CLI-Anwendung um einen soft link zu erstellen.

Code: Alles auswählen

function CreateLink(const AFilename, ALNKFilename, ADescription: string) : Boolean;
var
  psl : IShellLink;
  ppf : IPersistFile;
  wsz : PWideChar;
begin
  result:=false;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
  begin
    psl.SetPath(PChar(AFilename));
    psl.SetDescription(PChar(ADescription));
    psl.SetWorkingDirectory(PChar(ExtractFilePath(AFilename)));
    if SUCCEEDED(psl.QueryInterface(IPersistFile, ppf)) then
    begin
      GetMem(wsz, MAX_PATH*2);
      try
        MultiByteToWideChar(CP_ACP, 0, PChar(ALNKFilename), -1, wsz, MAX_PATH);
        ppf.Save(wsz, true);
        result:=true;
      finally
        FreeMem(wsz, MAX_PATH*2);
      end;
    end;
  end;
end;

Der Code an sich funktioniert und erstellt mir die entsprechende Verknüpfung, allerdings warte ich nach dem Ausführen mittels einem ReadLn, bis der Benutzer Enter drückt. Wenn ich nun allerdings Enter drücke, passiert nichts. Im Debugger habe ich dann gesehen, dass das Programm bei der Zeile psl.SetPath(PChar(AFilename)); hängen bleibt.

OS: Win 10 64-Bit
Laz: 1.6.4 Stable
FPC: 3.0.2 Stable

Gruß
Patrick

P.S.: Falls das Problem nicht zu lösen ist, kann ich notfalls auch per ShellExecute oder TProcess "mklink.exe" aufrufen, ist aber eine nicht ganz so schöne Variante.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: IShellLink.SetPath() Problem

Beitrag von compmgmt »

Kleiner Nachtrag: Das Merkwürdige ist, dass Anweisungen danach durchaus ausgeführt werden, allerdings reagiert das Programm nicht mehr richtig.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Antworten