CreateProcess不遵守命令行

时间:2015-01-27 17:46:29

标签: c++ winapi c++builder c++98

我正在尝试在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:“系统找不到指定的路径”。

此外,通过指定lpCurrentDirectory参数,它同样被忽略。

1 个答案:

答案 0 :(得分:1)

您必须在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;
}