CreateProcess 不遵守命令行
CreateProcessW not honoring commandline
我正在尝试在 dll 中实现 CreateProcessW,以便用户可以在单独的进程中启动应用程序。
对于初学者,我正在对代码中的命令进行硬编码,直到我弄明白为止..
我有
STARTUPINFO si = {sizeof(STARTUPINFO), 0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {0};
LPCTSTR AppName=L"c:\utilities\depends.exe";
LPTSTR Command = L"c:\utilities\tee.exe";
if (CreateProcessW(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi)) {
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return GX_RESULT_OK;
} else {
.. show error msg
}
这将启动 Depends 但不会打开 Tee.exe。没有错误,它只是忽略了命令行参数。参数正确,我可以在 运行 提示符下 运行 它并且工作正常。如果我将 AppName 留空并指定 Depends.exe 作为 Command 参数,它也可以工作,但如果我指定
LPTSTR Command = L"c:\utilities\depends.exe c:\utilities\tee.exe";
我收到错误 3:"The system cannot find the path specified"。
此外,通过指定 lpCurrentDirectory 参数,它同样会被忽略。
您必须在 command
中提供可执行文件
Appname
应包含可执行文件的完整路径
Command
还应包含 argv[0]
如果您想用记事本打开文件 t.txt
,您可以按如下方式输入:
Appname = "c:/windows/notepad.exe";
command = "notepad c:/temp/t.txt";
您甚至不必提供真正的程序名称,即使是假名也可以,因为它只是一个占位符。
像这样:command = "fake c:/temp/t.txt";
现在 notepad.exe:
argv[0] = "notepad";
argv[1] = "c:/temp/t.txt";
查看完整示例:
#include <Windows.h>
#include <iostream>
using namespace std;
int main(){
STARTUPINFO si = {sizeof(STARTUPINFO), 0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {0};
LPTSTR AppName=L"C:/Windows/notepad.exe";
wchar_t Command[] = L"notepad C:/Temp/t.txt";
DWORD res = CreateProcess(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi);
if (res) {
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
} else {
cerr<<"error..."<<GetLastError()<<endl;
};
return 0;
}
我正在尝试在 dll 中实现 CreateProcessW,以便用户可以在单独的进程中启动应用程序。
对于初学者,我正在对代码中的命令进行硬编码,直到我弄明白为止..
我有
STARTUPINFO si = {sizeof(STARTUPINFO), 0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {0};
LPCTSTR AppName=L"c:\utilities\depends.exe";
LPTSTR Command = L"c:\utilities\tee.exe";
if (CreateProcessW(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi)) {
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return GX_RESULT_OK;
} else {
.. show error msg
}
这将启动 Depends 但不会打开 Tee.exe。没有错误,它只是忽略了命令行参数。参数正确,我可以在 运行 提示符下 运行 它并且工作正常。如果我将 AppName 留空并指定 Depends.exe 作为 Command 参数,它也可以工作,但如果我指定
LPTSTR Command = L"c:\utilities\depends.exe c:\utilities\tee.exe";
我收到错误 3:"The system cannot find the path specified"。
此外,通过指定 lpCurrentDirectory 参数,它同样会被忽略。
您必须在 command
Appname
应包含可执行文件的完整路径Command
还应包含argv[0]
如果您想用记事本打开文件 t.txt
,您可以按如下方式输入:
Appname = "c:/windows/notepad.exe";
command = "notepad c:/temp/t.txt";
您甚至不必提供真正的程序名称,即使是假名也可以,因为它只是一个占位符。
像这样:command = "fake c:/temp/t.txt";
现在 notepad.exe:
argv[0] = "notepad";
argv[1] = "c:/temp/t.txt";
查看完整示例:
#include <Windows.h>
#include <iostream>
using namespace std;
int main(){
STARTUPINFO si = {sizeof(STARTUPINFO), 0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {0};
LPTSTR AppName=L"C:/Windows/notepad.exe";
wchar_t Command[] = L"notepad C:/Temp/t.txt";
DWORD res = CreateProcess(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi);
if (res) {
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
} else {
cerr<<"error..."<<GetLastError()<<endl;
};
return 0;
}