2012-06-08 2 views
1

Я должен признать, что большинство из элементов win32 api, с которыми я не знаком в этом коде. При этом я хотел бы включить то, что я знаю, в мой учебный процесс. Я пытаюсь создать цикл for, который будет CreateProcess несколько раз с различными аргументами каждый раз. В Visual Studio я получаю ошибку компиляции:Передача строкового массива в CreateProcess для цикла для нескольких процессов

source.cpp(138): error C3867: 'std::basic_string<_Elem,_Traits,_Alloc>::c_str': function call  missing argument list; use '&std::basic_string<_Elem,_Traits,_Alloc>::c_str' to create a  pointer to member 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char>, 
1>    _Alloc=std::allocator<char> 
1>   ] 

При выполнении следующего кода:

std::string arrString[3] = {"dir","cd ..","dir"}; 
      int i; 
      LPWSTR cmd =L"cmd"; 

      for(i=0; i<3; i++) 
      { 
      STARTUPINFO info={sizeof(info)}; 
      PROCESS_INFORMATION processInfo; 
      if (CreateProcess(cmd, arrString[i].c_str, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) 
      { 
       ::WaitForSingleObject(processInfo.hProcess, INFINITE); 
       CloseHandle(processInfo.hProcess); 
       CloseHandle(processInfo.hThread); 
      } 

Am Я даже движется в правильном направлении?

EDIT:

  std::string arrString[3] = {"cmd","cmd","cmd"}; 
      int i; 
      LPWSTR cmd =L"cmd"; 

      for(i=0; i<3; i++) 
      { 
       STARTUPINFO info={sizeof(info)}; 
       PROCESS_INFORMATION processInfo; 
       vector<wchar_t> cmdline(arrString[i].begin(), arrString[i].end()); 
       CreateProcessW(cmd, &cmdline[0], NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo); 
        ::WaitForSingleObject(processInfo.hProcess, INFINITE); 
        CloseHandle(processInfo.hProcess); 
        CloseHandle(processInfo.hThread); 

      } 
+0

Похоже, вы намерены получить списки каталогов текущего каталога и родительского каталога, но это не то, что этот код будет делать. Он запустит новый процесс с собственным понятием «текущий каталог» и запустит 'dir'. Затем он запустит * другой * процесс, опять же со своим собственным понятием «текущий каталог» и переключится на другой каталог. Затем он запустит * третий * процесс, снова наследующий тот же текущий каталог, что и ваша программа, и снова запустите 'dir'. Вы получите тот же список каталогов дважды. Чтобы получить список файлов, подумайте, начиная с 'FindFirstFile'. –

+0

@RobKennedy: Вы правы, но я использовал их только как пример. В моем коде он отличается, и процессы могут запускаться отдельно. Я использовал их как способ сократить его, например, для целей. – arynhard

ответ

3

В этой строке

if (CreateProcess(cmd, arrString[i].c_str, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) 

arrString[i].c_str Вы писали, когда вы имели в виду arrString[i].c_str().

+0

теперь я получаю ошибку, чем const * char несовместим с типом параметра «LPWSTR». – arynhard

+0

Как преобразовать arrString в LPWSTR? – arynhard

+0

@arynhard: вы строите с _WinAPI_, установленным на _Unicode_, поэтому он ожидает 'wchar_t' вместо' char'. Либо используйте std :: wstring или установите _WinAPI_ в _MultiByte Character_ в настройках проекта. –

Смежные вопросы