在Delphi中如何实现 DOS的这个命令 Xcopy C:\program\*.* D:\program\ . 说具体点! 我用shellExcute()打开一个*.exe的时候同时想在桌面上增加一个快捷方式,该如何做?
解决方案 »
- 看到网上有人编写的窗体编辑器,求个思路。
- delphi MessageBeep函数发声问题
- tclientdataset传输数据时出现mismatch in datapacket问题
- 团队开发问题
- 退出打印界面后报错
- 在工具栏中怎样添加Tserversocket组件
- DataSet的Filter为什么支持Like不支持not like?
- 一个窗体内多个相同控件,求最简单的检测其中任意一个控件发生变化的方法
- 求购一个mp3相关的程序,价格面议。up有分
- delphi怎么调用CHM文件啊?
- 一个字符字段长度是200,在打印时,一行打不完,怎样才能让其在下一行自动打印?
- 请问怎样在运行时向CrystalReport传递参数?
procedure TForm1.Button1Click(Sender: TObject);
var
m,a:Variant;
begin
M:= CreateOleObject('WScript.Shell');
A:=M.CreateShortcut('c:\a.lnk');
A.TarGetPath:='C:\test.exe';
a.WorkingDirectory:= 'C:\';
A.Save;A:= Unassigned;
M:= Unassigned;
end;
文本类容如下
copy C:\program\*.* D:\program\ 注意保存的时候你要用.bat格式
在delphi中用
shellExecute()执行该文件,你设置其中打开bat文件的窗体为隐藏类型,执行后关闭即可建立快捷方式的代码如下,稍微修改即可使用
procedure TForm1.Button1Click(Sender: TObject);
var
tmpObject : IUnknown;
tmpSLink : IShellLink;
tmpPFile : IPersistFile;
PIDL : PItemIDList;
StartupDirectory : array[0..MAX_PATH] of Char;
StartupFilename : String;
LinkFilename : WideString;
begin
StartupFilename := 'c:\windows\notepad.exe';
tmpObject := CreateComObject(CLSID_ShellLink);//创建建立快捷方式的外壳扩展
tmpSLink := tmpObject as IShellLink;//取得接口
tmpPFile := tmpObject as IPersistFile;//用来储存*.lnk文件的接口
tmpSLink.SetPath(pChar(StartupFilename));//设定notepad.exe所在路径
tmpSLink.SetWorkingDirectory(pChar(ExtractFilePath(StartupFilename)));//设定工作目录
SHGetSpecialFolderLocation(0,
CSIDL_DESKTOPDIRECTORY,
PIDL);//获得桌面的Itemidlist
SHGetPathFromIDList(PIDL,
StartupDirectory);//获得桌面路径
LinkFilename := StartupDirectory + '\MyNotepad.lnk';
tmpPFile.Save(pWChar(LinkFilename),FALSE);//保存*.lnk文件
end;
好象是不行?
在Uses中加入ShellAPI,procedure XCopy(From, Dest: string);
var
T: TSHFileOpStruct;
FromDir, Todir : pchar;
begin
GetMem(FromDir,Length(From)+2);
try
GetMem(ToDir,Length(Dest)+2);
try
FillChar(FromDir^,Length(From)+2,0);
FillChar(ToDir^,Length(Dest)+2,0); StrCopy(FromDir,PChar(From));
StrCopy(ToDir,PChar(Dest));
with T do
begin
Wnd :=0;
wFunc :=FO_COPY;
pFrom :=FromDir;
pTo :=ToDir;
fflags:=FOF_FILESONLY;
fAnyOperationsAborted:=False;
hNameMappings:=nil;
lpszProgressTitle:=nil;
if SHFileOperation(T)<>0 then
raise Exception.Create('Copy File fail!');
end;
finally
FreeMem(ToDir,Length(Dest)+2);
end;
finally
FreeMem(FromDir,Length(From)+2);
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
XCopy ('D:\Tools\DBBrowser', 'D:\TestCopy');
end;
var
fo: TSHFILEOPSTRUCT;
begin
FillChar(fo, SizeOf(fo), 0);
with fo do
begin
Wnd := 0;
wFunc := FO_COPY;
pFrom := PChar(source+#0);
pTo := PChar(Dest+#0);
fFlags := FOF_NOCONFIRMATION+FOF_NOCONFIRMMKDIR ;
end;
Result := (SHFileOperation(fo) = 0);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
copydirectory('c:\test','d:\');
end;
不好意思,D:\program\ .多了个空格
winexec('Xcopy C:\program\*.* D:\program\.',0)
winexec('Xcopy C:\program\*.* D:\program\ /s',0)
对文件或文件夹的操作都可以用TSHFILEOPSTURCT来实现。用SHELLEXECUTE好象不怎么地道吧。
var
AnObj:IUnknown;
ShLink:IShellLink;
PFile:IPersistFile;
FileName:string;
WFileName:WideString;
Reg:TRegIniFile;
begin
//access the two interface of the object
AnObj:=CreateComObject(CLSID_ShellLink);
ShLink:=Anobj as IShellLink;
PFile:=Anobj as IPersistFile; //get the name of the application file
FileName:=Paramstr(0);
//set the link properties
ShLink.SetPath(pchar(FileName));
ShLink.SetWorkingDirectory(PChar(ExtractFilePath(FileName)));
//save the file in the current dir
//useing a widestring
WFileName:=ExtractFilePath(FileName)+LnkName+'.lnk';
PFile.Save(pwchar(WFileName),false);
//save on the desktop
reg:=TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\explorer');
WFileName:=Reg.ReadString('Shell Folders','Desktop','')+'\'+LnkName+'.lnk';
reg.free;
PFile.Save(PWChar(WFileName),false);
//save in the start menu
reg:=TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\explorer');
WFileName:=Reg.ReadString('Shell Folders','Start Menu','')+'\'+LnkName+'.lnk';
reg.free;
PFile.Save(PWChar(WFileName),false);
end;