【问题标题】:What should the second parameter of CreateProcess be?CreateProcess 的第二个参数应该是什么?
【发布时间】:2012-02-24 07:32:50
【问题描述】:

我正在尝试使用 CreateProcess() 启动服务器。这是代码:

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.

    int result; 
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    CreateProcess("C:\\AP\\DatabaseBase\\dbntsrv.exe", "*** WHAT SHOULD I PUT HERE***", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    return 0;
}

我从文档中不明白第二个参数应该是什么。你能帮我吗? 谢谢你

【问题讨论】:

  • dbntsrv.exe 是否对命令行参数做任何事情?
  • 那你应该留空

标签: c++ winapi visual-c++ mfc createprocess


【解决方案1】:

来自 MSDN:

lpCommandLine [输入,输出,可选]

要执行的命令行。此字符串的最大长度为 32,768 个字符,包括以 Unicode 结尾的 null 特点。如果 lpApplicationName 为 NULL,则模块名称部分 lpCommandLine 仅限于 MAX_PATH 个字符。

此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。因此,该参数不能是 指向只读内存的指针(例如 const 变量或文字 细绳)。如果此参数是一个常量字符串,该函数可能 导致访问冲突。

lpCommandLine 参数可以为 NULL。 在这种情况下,函数使用 lpApplicationName 指向的字符串作为 命令行。

所以NULL 至少在那里是可以的。只要你不传递参数。

【讨论】:

    【解决方案2】:

    您使用它将参数传递给第一个参数定义的 .exe:

    例如调用 cmd.exe,然后运行脚本或使用 zip 实用程序:

    void runCmd(const tstring& cmdString, STARTUPINFO &si, PROCESS_INFORMATION &pi)
    {
        ZeroMemory( &si, sizeof(si) );
        ZeroMemory( &pi, sizeof(pi) );
        si.cb = sizeof(si);
    
        tstring cmd_exe_path(win_dir);
        cmd_exe_path.append( _T("\\System32\\") ).append(CMD_PROCESS);
    
        tstring argline( _T("/c ") );
        argline += cmdString;
    
        tstring curr_dir( cmdString.substr( 0, cmdString.rfind( _T('.') ) ) );
        curr_dir.erase( curr_dir.find_last_of( _T("/\\") ) );
        size_t pos = curr_dir.find( _T("\"") );
        while(  pos != tstring::npos )
        {
            curr_dir.erase( pos, pos + 1 );
            pos = curr_dir.find( _T("\"") );
        }
    
        //USE FULL PATHS FOR SAFETY... Include wrapping quotes if spaces required in path
        LOG(LOG_INFO,_T("runCmd(): Calling %s %s Dir[ %s ]"),cmd_exe_path.c_str(),argline.c_str(), curr_dir.c_str());
    
        if( !CreateProcess( cmd_exe_path.c_str(), &argline[0], NULL, NULL, FALSE, CREATE_NEW_CONSOLE, 
                            NULL,curr_dir.c_str(),&si,&pi ) ) //this generates warning C6335 - resource leak... however handles should be closed by owner
        {
            DWORD dw = GetLastError(); 
            std::string error( "runCmd(): Failed to create Shutdown process - error code is " );
            error.append(boost::lexical_cast<std::string>(dw));
            LOG(LOG_INFO,error.c_str());
            throw std::exception(error.c_str());
        }
    
        LOG(LOG_INFO,"runCmd(): process starting with PID[%d] TID[%d]",pi.dwProcessId,pi.dwThreadId);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      相关资源
      最近更新 更多