我如何从 delphi 7 应用程序 运行 mklink 系统命令 (cmd.exe)
How can I run a mklink system command (cmd.exe) from a delphi 7 aplpication
在 运行 的应用程序中,我想 运行 命令行 Mklink /d(link 位置)(实际 file/folder 位置).
到目前为止我有:
symLink := PChar('/d C:\Data\'+fileName+' N:\"Database Archives"\'+fileName);
ShellExecute(0, nil, 'Mklink', symLink, nil, SW_SHOWNORMAL);
但我也尝试过:
symLink := PChar('Mklink /d C:\Data\'+fileName+' N:\"Database Archives"\'+fileName);
ShellExecute(0, nil, 'cmd.exe', symLink, nil, SW_SHOWNORMAL);
我的方向正确吗?
有没有文档解释ShellExecute
需要的每个参数?
简单地说,不要这样做。使用 API。它被称为 CreateSymbolicLink
。传递 SYMBOLIC_LINK_FLAG_DIRECTORY
标志。
这更加稳健,可以让您正确报告错误,应对没有 cmd.exe
的系统等等。
请注意,创建符号链接需要提升进程。我相信你已经知道了。还要按照链接文档中的描述检查错误。
更广泛地说,您需要重新考虑问题中的具体路径。您不能创建跨卷符号链接。
关于文档,这些是 Windows 功能。只需在搜索引擎中输入名称,您就会找到 MSDN 文档。
在较旧的 Delphi 中,您需要定义函数,因为提供的 header 翻译没有它。
const
SYMBOLIC_LINK_FLAG_DIRECTORY = [=10=]000001;
function CreateSymbolicLinkA(
lpSymlinkFileName: PAnsiChar;
lpTargetFileName: PAnsiChar;
dwFlags: DWORD
): Boolean; stdcall; external 'kernel32';
function CreateSymbolicLinkW(
lpSymlinkFileName: PWideChar;
lpTargetFileName: PWideChar;
dwFlags: DWORD
): Boolean; stdcall; external 'kernel32';
在 运行 的应用程序中,我想 运行 命令行 Mklink /d(link 位置)(实际 file/folder 位置).
到目前为止我有:
symLink := PChar('/d C:\Data\'+fileName+' N:\"Database Archives"\'+fileName);
ShellExecute(0, nil, 'Mklink', symLink, nil, SW_SHOWNORMAL);
但我也尝试过:
symLink := PChar('Mklink /d C:\Data\'+fileName+' N:\"Database Archives"\'+fileName);
ShellExecute(0, nil, 'cmd.exe', symLink, nil, SW_SHOWNORMAL);
我的方向正确吗?
有没有文档解释ShellExecute
需要的每个参数?
简单地说,不要这样做。使用 API。它被称为 CreateSymbolicLink
。传递 SYMBOLIC_LINK_FLAG_DIRECTORY
标志。
这更加稳健,可以让您正确报告错误,应对没有 cmd.exe
的系统等等。
请注意,创建符号链接需要提升进程。我相信你已经知道了。还要按照链接文档中的描述检查错误。
更广泛地说,您需要重新考虑问题中的具体路径。您不能创建跨卷符号链接。
关于文档,这些是 Windows 功能。只需在搜索引擎中输入名称,您就会找到 MSDN 文档。
在较旧的 Delphi 中,您需要定义函数,因为提供的 header 翻译没有它。
const
SYMBOLIC_LINK_FLAG_DIRECTORY = [=10=]000001;
function CreateSymbolicLinkA(
lpSymlinkFileName: PAnsiChar;
lpTargetFileName: PAnsiChar;
dwFlags: DWORD
): Boolean; stdcall; external 'kernel32';
function CreateSymbolicLinkW(
lpSymlinkFileName: PWideChar;
lpTargetFileName: PWideChar;
dwFlags: DWORD
): Boolean; stdcall; external 'kernel32';