2012-02-24 29 views
1

CreateProcess()を使用してサーバーを起動しようとしています。コードは次のとおりです。CreateProcessの2番目のパラメータはどのようにすべきですか?

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

第2パラメータの内容はドキュメントからわかりませんでした。それで私を助けてもらえますか? は、MSDNからあなたに

+0

についてが説明されては、 'コマンドライン引数で何かをdbntsrv.exe'していますか? –

+0

いいえ、そうではありません。 – digvijay

+0

それからそれを空白のままにしてください –

答えて

3

ありがとう:実行される

lpCommandLine

[オプション、外、内]コマンドライン。この文字列の最大長は32,768文字で、Unicode終端NULL 文字を含みます。 lpApplicationNameがNULLの場合、 lpCommandLineのモジュール名部分はMAX_PATH文字に制限されます。

この関数のUnicodeバージョンCreateProcessWは、この文字列の内容を変更できます。したがって、このパラメータには、読み取り専用メモリへのポインタ(const変数またはリテラル 文字列など)を指定することはできません。このパラメータが定数文字列の場合、関数は によってアクセス違反を引き起こす可能性があります。

lpCommandLineパラメータにはNULLを使用できます。この場合、関数はlpApplicationNameが指す文字列を コマンドラインとして使用します。

だから少なくともNULLはOKです。引数を渡さないとすぐに。あなたが最初のパラメータで定義された.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を呼び出してから、スクリプトを実行するか、zipユーティリティを使用することです

+0

ありがとうございます! – digvijay

+0

@digvijay - あなたが私の答えを見つけたら、少なくともそれをupvoteしてください。ありがとう。 – Dennis

+1

私は申し訳ありませんが、あなたの答えをアップアップするのに十分な担当者がいません。しかし、私がそうすると、私は確かにそれをupvoteします – digvijay

関連する問題