2012-02-24 2 views
1

CreateProcess()를 사용하여 서버를 시작하려고합니다. 코드는 다음과 같습니다.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; 
} 

두 번째 매개 변수가 무엇인지 문서에서 알 수 없습니다. 그걸로 나를 도울 수 있니? 은 MSDN에서 당신에게

+0

합니까'명령 행 인수에 아무것도 할 dbntsrv.exe'에 대한이 설명? –

+0

아니요, 그렇지 않습니다. – digvijay

+0

그렇다면 비워 두어야합니다. –

답변

3

감사 : [선택, 출력,]

lpCommandLine

명령 줄이 실행 될 수 있습니다. 이 문자열의 최대 길이는 Unicode 종료 널 문자를 포함하여 32,768 자입니다. lpApplicationName이 NULL이면 lpCommandLine의 모듈 이름 부분은 MAX_PATH 문자로 제한됩니다.

이 함수의 유니 코드 버전 인 CreateProcessW는이 문자열의 내용을 수정할 수 있습니다. 따라서이 매개 변수는 읽기 전용 메모리 (예 : const 변수 또는 리터럴 문자열)에 대한 포인터 일 수 없습니다. 이 매개 변수가 상수 문자열 인 경우이 함수는 액세스 위반을 일으킬 수 있습니다.

lpCommandLine 매개 변수는 NULL 일 수 있습니다.이 경우 함수는 lpApplicationName이 가리키는 문자열을 명령 줄로 사용합니다.

그래서 NULL은 정상입니다. 인수를하지 않는 한 빨리 당신은 첫 번째 매개 변수에 의해 정의 된 .EXE에 인수를 전달하는 데 사용할

+0

대단히 감사합니다. – digvijay

1

는 :

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); 
} 
:

예는 cmd.exe를 호출 한 후 스크립트를 실행하거나 우편 유틸리티를 사용하는 것

+0

대단히 감사합니다 !! – digvijay

+0

@ digvijay - 내 대답이 유용하다면 적어도 그것을 upvote 바랍니다. 감사. – Dennis

+1

죄송 합니다만 답변을 upvote 할 수있는 충분한 담당자가 없습니다 ..하지만 제가 할 때, 나는 그것을 확실히 upvote 것입니다 – digvijay