【发布时间】:2021-08-06 12:24:46
【问题描述】:
我有一个简单的 C++ 控制台应用程序,它启动 notepad.exe 并加载文件 D:\MyTextFile.txt,然后控制台应用程序退出,但记事本仍在运行。代码效果很好:
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );
WCHAR pCmd[] = {'n','o','t','e','p','a','d','.','e','x','e',' ','D',':','\\','M','y','T','e','x','t','F','i','l','e','.','t','x','t',0};
BOOL result = CreateProcess
(
_T("C:\\Windows\\System32\\notepad.exe"), // Module name
pCmd, // Command line (as modifiable array)
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set bInheritHandles to FALSE
DETACHED_PROCESS, // Detach process
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi // Pointer to PROCESS_INFORMATION structure (returned)
);
return (result) ? 0 : -1;
}
但是,如果我将记事本替换为 cmd 并将 MyTextFile.txt 替换为 MyBatFile.bat,则它不起作用。 MyBatFile.bat 的内容:
C:\Windows\System32\notepad.exe D:\MyTextFile.txt
修改后的控制台应用程序:
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );
WCHAR pCmd[] = {'c','m','d','.','e','x','e',' ','/','C',' ','D',':','\\','M','y','B','a','t','F','i','l','e','.','b','a','t',0};
BOOL result = CreateProcess
(
_T("C:\\Windows\\System32\\cmd.exe"), // Module name
pCmd, // Command line (as modifiable array)
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set bInheritHandles to FALSE
DETACHED_PROCESS, // Detach process
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi // Pointer to PROCESS_INFORMATION structure (returned)
);
return (result) ? 0 : -1;
}
当我执行上面的代码时,我看到一个命令提示符快速闪烁,但它似乎没有执行 MyBatFile.bat。但是,如果我将DETACHED_PROCESS 替换为CREATE_UNICODE_ENVIRONMENT,则执行 MyBatFile.bat,但由于不再分离该进程,因此命令提示符会挂起,直到我关闭记事本,这是不希望的。有谁知道我如何修改我的代码以便能够在分离的进程中执行 MyBatFile.bat?
【问题讨论】:
-
不相关但为什么不只是
WCHAR pCmd[] = L"cmd.exe /C ..."? -
我想强调它是一个可修改的数组。有些人看到“...”时会想到 const
-
批处理文件中有什么?它正在打开它,但正在关闭,也许在批处理文件的底部添加一个
pause。或者,如果您无法编辑批处理文件,请使用cmd /k而不是/c到/keep 打开它。 -
如果您无法编辑批处理文件,您也可以将其名称更改为其他名称,内容类似于
@pause -
我拥有对 MyBatFile.bat 的完全访问权限,并且在末尾插入 pause 或 @pause 并没有什么不同,当我从 Visual Studio 运行项目时,命令提示符仍然快速闪烁。如果我从命令提示符
(cmd.exe, then cd D:\MyProjects\RunDetached\debug and then RunDetached.exe)运行项目,那么闪烁的命令提示符就会消失,我什么也看不到。在我运行 RunDetached.exe 的命令提示符中没有报告任何内容(没有错误、警告或任何其他信息)。
标签: c++ batch-file cmd process createprocess