Q:
How can I create a standard windows shortcut file (*.lnk) from my Delphi application?
A:
Below is an example that creates a shortcut to a DOS batch file.
You need to use the procedure CreateLink();
program kg_MakeLink;
{****************************************************************}
{* Programmer: Kevin S. Gallagher *}
{* *}
{* Language: Delphi 3.00, 32 bit *}
{* All code is within this one source file. *}
{* *}
{* Description: Used to programmically create a 'ShortCut' to a *}
{* DOS batch file. The ShortCut when invoked will *}
{* run in a minimized state. Location of newly *}
{* created ShortCut is in the same directory as *}
{* the batch file. *}
{* *}
{* Comments: It is up to the programmer to insure that all *}
{* commands called in the batch file are valid. *}
{* *}
{* Suggestions: Attempt running the batch file under abnormal *}
{* conditions to see how things go, does the DOS *}
{* calls hang? etc. *}
{* *}
{* Error Codes: 0 = Success *}
{* 1 = Either to many or not enough parameters *}
{* 2 = File passed to this util, does not exist *}
{* 3 = Failed to created ShortCut *}
{****************************************************************}
uses
Windows, ShlObj, ActiveX, ComObj, SysUtils, Dialogs;
{$R *.RES}
procedure CreateLink(Target, Args, WorkDir, ShortCutName: String);
var
IObj: IUnknown;
Link: IShellLink;
IPFile: IPersistFile;
TargetW: WideString;
begin
IObj := CreateComObject(CLSID_ShellLink);
Link := IObj as IShellLink;
IPFile := IObj as IPersistFile;
with Link do
begin
SetPath(PChar(Target));
SetArguments(PChar(Args));
SetShowCmd(SW_SHOWMINIMIZED);
SetWorkingDirectory(PChar(WorkDir));
end;
TargetW := ShortCutName;
IPFile.Save(PWChar(TargetW), False);
end;
var
a,
b: String;
begin
if ParamCount=1 then
begin
a := ParamStr(1);
if FileExists(a) then
begin
ShowMessage('A = '+a);
b := ExtractFilename(a)+'.lnk';
ShowMessage('B = '+b);
try
CreateLink(a, '', '', ExtractFileDir(a)+#92+b);
except
halt(3); { Failed to create shortcut }
end;
end
else
halt(2); { File does not exist }
end
else
halt(1); { Wrong amount of arguments }
end.