- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想通过 CreateProcess() - 调用实现以下目标:
我用下面的函数试试这个
procedure TQPortMainForm.CmdMigrationClick(Sender: TObject);
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CreateOk: boolean;
input: String;
begin
{ fill with known state }
FillChar(StartInfo, SizeOf(TStartupInfo), #0);
FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
StartInfo.cb := SizeOf(TStartupInfo);
//debug
input := 'D: && cd D:\Qport\trunk\Qport\ && ' + SVN_PATH + ' log > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt';
CreateOk := CreateProcess(nil, PChar(input), nil, nil, false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil,
nil , StartInfo, ProcInfo);
{ check to see if successful }
if CreateOk then
// may or may not be needed. Usually wait for child processes
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;
什么也没有发生。有人知道如何实现这一目标吗?
谢谢,
菲利普
编辑 1:我正在使用 Delphi XE - Build 7601:Service Pack 1
编辑 2:这是解决方案:
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CreateOk: boolean;
input: String;
path : String;
cmd : String;
begin
{ fill with known state }
FillChar(StartInfo, SizeOf(TStartupInfo), #0);
FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
StartInfo.cb := SizeOf(TStartupInfo);
path := 'D:\Qport\trunk\Qport\';
cmd := 'C:\Windows\System32\cmd.exe';
//debug
input := '/C' + SVN_PATH + ' help > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt';
CreateOk := CreateProcess(PChar(cmd), PChar(input), nil, nil, false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil,
Pchar(path), StartInfo, ProcInfo);
{ check to see if successful }
if CreateOk then
// may or may not be needed. Usually wait for child processes
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;
最佳答案
调用 CreateProcess
时需要提供一个可执行文件。我猜你习惯于调用更松散的 ShellExecute
。
您显然希望调用 cmd.exe
,因此您应该将其添加到命令行。不要在 cmd.exe
启动后更改工作目录,而是使用 CreateProcess
的 lpCurrentDirectory
参数来执行此操作。您还需要将 /C
选项传递给 cmd.exe
以使其在命令完成后关闭。
所以你需要将input
改成这样:
input := GetEnvironmentVariable('COMSPEC') + ' /C ' + SVN_PATH +
' log > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt';
我使用 GetEnvironmentVariable('COMSPEC')
作为获取命令解释器路径的方法。
然后像这样调用CreateProcess
:
CreateProcess(
nil,
PChar(input),
nil,
nil,
False,
CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS,
nil,
'D:\Qport\trunk\Qport',
StartInfo,
ProcInfo
);
使用或
来组合标志比+
在语义上更清晰,尽管它对这些标志具有相同的效果。
需要注意的一点是第二个参数必须指向可写内存。那是因为 CreateProcess
可能会修改该参数。碰巧,您的 input
设置将满足该要求。在任何情况下,我都建议调用 UniqueString
以明确表示您满足该要求。
我发现缺少的另一件事是关闭 CreateProcess
返回的句柄的代码。最后通过执行以下操作关闭这些句柄:
//WaitForSingleObject(ProcInfo.hProcess, INFINITE); //in case you want to wait for Process to terminate
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
关于windows - Delphi - CreateProcess - 执行多个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18013251/
我正在使用 Android Studio。我想在 github 上分享我的项目,但我遇到了很多问题。 首先,Android studio找不到git.exe。我可以用某种方式解决那个问题,但现在是下一
今天,我刚刚使用 Android SDK 管理器更新了 Windows 7 上的 Android SDK,并在 Eclipse 中构建期间开始出现错误 "Error executing aapt: C
由于某种原因创建进程打开cmd即使未指定按 Enter 键会导致命令行中弹出更多 cmd 实例。 #include #include void main() { PROCESS_INFOR
这个问题已经有答案了: Unhandled Error with CreateProcess [duplicate] (2 个回答) 已关闭 4 年前。 我的目标是在我的程序中执行外部可执行文件。首先
当使用 CreateProcess 运行另一个程序时,捕获标准输出的推荐方法是什么?也就是说,将第二个程序打印到 stdout 的任何内容,并以第一个程序可以分析它的数组结束? 这两个程序都是用 C
这个问题在这里已经有了答案: Unhandled Error with CreateProcess [duplicate] (2 个答案) 关闭 4 年前。 我的目标是在我的程序中执行一个外部可执行
我的以下代码有问题: int main(int argc, char **argv) { PROCESS_INFORMATION pi; STARTUPINFO si; prin
forking() 和 CreateProcess(带有所有必需的参数)对于 Linux 和 WinXP 是否分别是相同的? 如果它们不同,那么有人可以解释两种情况下发生的情况的差异吗? 谢谢 最佳答
我正在寻找 Delphi 中 CreateProcess 的快速替代方案,以在 exe 中执行某些计算,包括 XML 中的多个返回值。目前,我正在调用带有特定参数的 C#-exe。这些电话之一需要大约
我有我的主应用程序,从我的主应用程序我将调用另一个 模块(第三方)在我的主应用程序中执行一个小操作,当我调用该模块时..它处理特定时间说 5 秒。而它的处理它在命令窗口中显示了一些信息..现在我的主应
我注意到了这种行为: 当前目录下有2个可执行文件,分别名为“somefile”和“somefile.abc”。 CreateProcessA(NULL, "somefile", ...) - 失败,错
C 初学者警告!!! 我正在用 c 编写一个应用程序,该应用程序应该在“cmd.exe”上下文中运行用户定义的命令并将输出写入变量。例如,如果命令变量是“dir C:\”,则 c 程序应使用 Crea
我正在尝试使用 CreateProcess() 启动服务器。这是代码: int APIENTRY WinMain(HINSTANCE hInstance, H
所以我使用这段代码来启动带有参数的控制台应用程序: #include #include using namespace std; void StartProgram(char argv[]) {
我刚刚安装了代码块 我在安装时遇到错误(无法在 gcc gnu 中配置的路径中找到编译器可执行文件) 所以我安装了编译器MinGW出现这个错误 错误: *CreateProcess:没有这样的文件或目
我正在尝试弄清楚如何使用 CreateProcess() 函数,但我不太精通 C++。我已经尝试了一些方法来尝试让错误消失,但应用程序似乎没有按照我期望的方式执行。 我想做的是将“cmd.exe/c
我有一个应用程序,用户可以在其中将文件上传到远程服务器,接收该文件的同一台服务器应该运行该应用程序。我正在使用 CreateProcess 方法。问题是,文件目录已经在 std::字符串中定义,我很难
如果程序A被用户以管理员身份执行,程序A是否可以使用CreateProcess() windows函数以管理员权限启动程序B?提前谢谢你 最佳答案 答案是肯定的。如果启动程序以提升的方式运行,您可以以
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在尝试在 windows 7 上的 windows visual studio 2012 professional 上使用 visual c++ 打开一个程序。代码将顺利运行,但实际上不会打开程序
我是一名优秀的程序员,十分优秀!