C ++进程类错误

时间:2014-03-03 20:52:26

标签: c++ winapi

在教程here之后,我决定为C ++创建一个process类,这样我就不必经常写出相同的代码来启动进程。它确实可以启动进程,但是当我传递命令行函数时,它什么也没做。示例("c:\\windows\\notepad.exe", "c:\\windows\\PFRO.txt")。有什么问题?

注意:format只是一个基本的格式化功能,使用vsprintf

class process
{
public:
    static BOOL __stdcall start(LPCSTR _Proc_name, LPSTR _Command_line = NULL, LPSECURITY_ATTRIBUTES _Proc_attrib = NULL,
        LPSECURITY_ATTRIBUTES _Thread_attrib = NULL, BOOL _Inherits_handles = FALSE, DWORD _Creation_flags = NULL,
        LPVOID _Environment = NULL, LPCSTR _Cur_directory = NULL)
    {
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
        ZeroMemory(&pi, sizeof(pi));
        if (!CreateProcess(_Proc_name, _Command_line, _Proc_attrib, _Thread_attrib, 
            _Inherits_handles, _Creation_flags, _Environment, _Cur_directory, &si, &pi))
        {
            fputs(format("process::start(...) failed [%d]\n", GetLastError()), stderr);
            return false;
        }
        WaitForSingleObject(pi.hProcess, INFINITE);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
        return true;
    }
};

int main()
{
    process::start("c:\\windows\\notepad.exe", "c:\\windows\\PFRO.txt");
    getchar();
}

1 个答案:

答案 0 :(得分:1)

解析命令行参数以提供main函数的参数时,第一个标记将被视为可执行文件。一个被调用的程序可能会尝试打开第二个标记作为其文件参数,当然你没有一个。

通常的做法是重复程序名称作为命令行中的第一个标记。例如

process::start("c:\\windows\\notepad.exe", "notepad c:\\windows\\PFRO.txt");