如何在Windows桌面上创建文件快捷方式(* .lnk文件)?
function GetDesktopFolder: string;
var
buf: array[0..MAX_PATH] of Char;
pidList: PItemIDList;
begin
Result := StrNoDesktopFolderFo;
SHGetSpecialFolderLocation(Application.Handle, CSIDL_DESKTOP, pidList);
if (pidList <> nil) then
if (SHGetPathFromIDList(pidList, buf)) then
Result := buf;
end;
procedure p;
var
i: Integer;
IObject: IUnknown;
ISLink: IShellLink;
IPFile: IPersistFile;
PIDL: PItemIDList;
InFolder: array[0..MAX_PATH] of Char;
TargetName: string;
LinkName: string;
begin
TargetName := 'c:\folder\exeFile.exe';//hardcoded example
IObject := CreateComObject(CLSID_ShellLink) ;
ISLink := IObject as IShellLink;
IPFile := IObject as IPersistFile;
with ISLink do
begin
SetDescription('what ever');
SetPath(pChar(TargetName)) ;
SetWorkingDirectory(pChar(ExtractFilePath(TargetName))) ;
end;
SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL) ;
SHGetPathFromIDList(PIDL, InFolder) ;
LinkName := getDesktopFolder+'\';
i := ;
LinkName:= linkname+ExtractFileName(TargetName)+'.lnk';
if LinkName = StrNoDesktopFolderFo then
Exit;
if not FileExists(LinkName) then
IPFile.Save(PWChar(LinkName), False);
Application.Terminate;
end;
上面的代码会导致很多错误,在Delphi中,不能运行两次...如何在Windows桌面上创建文件快捷方式(* .lnk文件)?
任何想法?
Btw。来源并不是我的原始资料,而是从网络上的地方找到的。
我会做例如获得特殊的文件夹位置,创建快捷方式(链接)这样
uses
ShlObj, ComObj, ActiveX;
function GetDesktopFolder: string;
var
PIDList: PItemIDList;
Buffer: array [0..MAX_PATH-1] of Char;
begin
Result := '';
SHGetSpecialFolderLocation(Application.Handle, CSIDL_DESKTOP, PIDList);
if Assigned(PIDList) then
if SHGetPathFromIDList(PIDList, Buffer) then
Result := Buffer;
end;
function CreateDesktopShellLink(const TargetName: string): Boolean;
var
IObject: IUnknown;
ISLink: IShellLink;
IPFile: IPersistFile;
PIDL: PItemIDList;
LinkName: string;
InFolder: array [0..MAX_PATH-1] of Char;
begin
Result := False;
IObject := CreateComObject(CLSID_ShellLink);
ISLink := IObject as IShellLink;
IPFile := IObject as IPersistFile;
with ISLink do
begin
SetDescription('Description ...');
SetPath(PChar(TargetName));
SetWorkingDirectory(PChar(ExtractFilePath(TargetName)));
end;
SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL);
SHGetPathFromIDList(PIDL, InFolder) ;
LinkName := IncludeTrailingBackslash(GetDesktopFolder);
LinkName := LinkName + ExtractFileName(TargetName) + '.lnk';
if not FileExists(LinkName) then
if IPFile.Save(PWideChar(LinkName), False) = S_OK then
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if CreateDesktopShellLink('C:\Folder\ExeFile.exe') then
ShowMessage('Link has been created ...');
end;
我觉得你施放刺成pwidechar犯了一个错误......这是行不通的,直到我说这个: LINKNAME :string; WLinkName:widetring; myWideCharPtr:PWideChar; InFolder:char的数组[0..MAX_PATH-1]; 然后 WLinkName:= LINKNAME; myWideCharPtr:= Addr(WLinkName [1]);如果不是FileExists(LinkName)则 如果IPFile.Save(myWideCharPtr,False)= S_OK,则 结果:= True;如果不存在则返回 。 – nagylzs
在德尔福7与@nagylzs的变化工作。 – tuxar
功能,以及更多可以在100多个程序和功能的免费软件dsiWin32库中找到。请下载http://gp.17slon.com/gp/dsiwin32.htm并感谢Primoz Gabrijelcic和Delphi-SI社区提供的帮助。
最大
没有问题,但你的阵列应该是0..MAX_PATH-1 –