C++ CreateProcess的第二个参数应该是什么?
我正在尝试使用CreateProcess()启动服务器。代码如下:C++ CreateProcess的第二个参数应该是什么?,c++,winapi,visual-c++,mfc,createprocess,C++,Winapi,Visual C++,Mfc,Createprocess,我正在尝试使用CreateProcess()启动服务器。代码如下: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. int resu
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;
}
我没有从文档中理解第二个参数应该是什么。你能帮我吗?
感谢您来自MSDN:
lpCommandLine[输入、输出、可选]
要执行的命令行。此字符串的最大长度为32768个字符,包括Unicode终止null
性格如果lpApplicationName为NULL,则
lpCommandLine限制为最大路径字符数
此函数的Unicode版本CreateProcessW可以修改此字符串的内容。因此,此参数不能是
指向只读内存(如常量变量或文本)的指针
字符串)。如果此参数是常量字符串,则函数可能
导致访问冲突
lpCommandLine参数可以为NULL。在这种情况下,函数使用lpApplicationName指向的字符串作为
命令行
所以NULL
至少在那里是可以的。只要不传递参数。来自MSDN:
lpCommandLine[输入、输出、可选]
要执行的命令行。此字符串的最大长度为32768个字符,包括Unicode终止null
性格如果lpApplicationName为NULL,则
lpCommandLine限制为最大路径字符数
此函数的Unicode版本CreateProcessW可以修改此字符串的内容。因此,此参数不能是
指向只读内存(如常量变量或文本)的指针
字符串)。如果此参数是常量字符串,则函数可能
导致访问冲突
lpCommandLine参数可以为NULL。在这种情况下,函数使用lpApplicationName指向的字符串作为
命令行
所以
NULL
至少在那里是可以的。只要不传递参数。就可以使用它将参数传递给第一个参数定义的.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);
}
void runCmd(const tstring&cmdString、STARTUPINFO&si、流程信息&pi)
{
零内存(&si,sizeof(si));
零内存(&pi,sizeof(pi));
si.cb=sizeof(si);
t字符串cmd_exe_路径(win_dir);
cmd_exe_path.append(\\System32\\).append(cmd_进程);
T字符串argline(_T(“/c”);
argline+=cmdString;
tstring curr_dir(cmdString.substr(0,cmdString.rfind('.'));
curr\u dir.erase(curr\u dir.find\u last\u of(\u T(“/\”));
size\u t pos=curr\u dir.find(\u t(“\”);
while(pos!=tstring::npos)
{
当前方向擦除(位置,位置+1);
pos=当前目录查找(\);
}
//为安全起见,请使用完整路径…如果路径中需要空格,请包含换行引号
日志(LOG_INFO,_T(“runCmd():调用%s%s目录[%s]”)、cmd_exe_path.c_str()、argline.c_str()、curr_Dir.c_str());
如果(!CreateProcess(cmd_exe_path.c_str(),&argline[0],NULL,NULL,FALSE,CREATE_NEW_CONSOLE,
NULL,curr_dir.c_str(),&si,&pi))//这会生成警告C6335-资源泄漏…但是句柄应由所有者关闭
{
DWORD dw=GetLastError();
std::字符串错误(“runCmd():未能创建关闭进程-错误代码为”);
错误。追加(boost::词法转换(dw));
日志(LOG_INFO,error.c_str());
抛出std::exception(error.c_str());
}
日志(LOG_INFO,“runCmd():以PID[%d]TID[%d]开头的进程”,pi.dwProcessId,pi.dwThreadId);
}
您可以使用它将参数传递给第一个参数定义的.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);
}
void runCmd(const tstring&cmdString、STARTUPINFO&si、流程信息&pi)
{
零内存(&si,sizeof(si));
零内存(&pi,sizeof(pi));
si.cb=sizeof(si);
t字符串cmd_exe_路径(win_dir);
cmd_exe_path.append(\\System32\\).append(cmd_进程);
T字符串argline(_T(“/c”);
argline+=cmdString;
tstring curr_dir(cmdString.substr(0,cmdString.rfind('.'));
curr\u dir.erase(curr\u dir.find\u last\u of(\u T(“/\”));
size\u t pos=curr\u dir.find(\u t(“\”);
while(pos!=tstring::npos)
{
当前方向擦除(位置,位置+1);
pos=当前目录查找(\);
}
//为安全起见,请使用完整路径…如果路径中需要空格,请包含换行引号
日志(LOG_INFO,_T(“runCmd():调用%s%s目录[%s]”)、cmd_exe_path.c_str()、argline.c_str()、curr_Dir.c_str());
如果(!CreateProcess(cmd_exe_path.c_str(),&argline[0],NULL,NULL,FALSE,CREATE_NEW_CONSOLE,
NULL,curr_dir.c_str(),&si,&pi))//这会生成警告C6335-资源泄漏…但是句柄应由所有者关闭
{
DWORD dw=GetLastError();
std::字符串错误(“runCmd():未能创建关闭进程-错误代码为”);
错误。追加(boost::词法转换(dw));
日志(LOG_INFO,error.c_str());
抛出std::exception(error.c_str());
}
日志(LOG_INFO,“runCmd():以PID[%d]TID[%d]开头的进程”,pi.dwProcessId,pi.dwThreadId);
}
dbntsrv.exe是否使用命令行参数执行任何操作?然后应将其留空是否使用命令行参数执行任何操作?然后应将其留空