2012-06-18 2 views
1

Я задал связанный с ним вопрос (http://stackoverflow.com/questions/10969488/why-does-windows-spawn-process-sometimes-trigger-error-status-sxs-assembly-not-f), но Я боюсь, что его запутал сложность вопроса, так что вот очень простая версия:Как использовать _spawnvpe() с пользовательским значением PATH?

Вот пример вызова _spawnvpe, вручную передающего значение PATH.

Не работает. Это ошибки и не будет запускать блокнот.

Переход на _spawnv или отсутствие передачи значения PATH заставляет его работать. Однако в документации на _putenv четко указано, что формат для значения env равен KEY = VALUE.

Как это сделать?

Просьба указать конкретную информацию и предоставить либо полную, либо полную копию приведенного ниже кода, включая исправление.

#include <stdio.h> 
#include <windows.h> 
#include <process.h> 
#include <errno.h> 

int main(int argc, char *argv[]) { 

    char *path_value; 
    char buffer[4000]; 
    const char *env[2]; 
    const char *args[1]; 
    char *command; 
    int result; 
    intptr_t procHandle; 

    path_value = getenv("PATH"); 
    sprintf(buffer, "PATH=%s", path_value); 
    env[0] = buffer; 
    env[1] = NULL; 

    args[0] = NULL; 

    int offset = 0; 
    while (env[offset] != NULL) { 
    printf("env %d: %s\n", offset, env[offset]); 
    ++offset; 
    } 

    offset = 0; 
    while (args[offset] != NULL) { 
    printf("arg %d: %s\n", offset, args[offset]); 
    ++offset; 
    } 

    command = "C:\\windows\\system32\\notepad.exe"; 

    procHandle = _spawnvpe(_P_NOWAIT, command, args, NULL); 
    if (procHandle == -1) { 
    printf("Failed to invoke command: %s\n", strerror(errno)); 
    exit(1); 
    } 

    _cwait(&result, procHandle, 0); 
    if (result != 0) 
    printf("Command exited with error code %d\n", result); 
} 
+1

Обязательно используйте отладочную сборку, она дает вам утверждение в этом коде. argv [0] не может быть NULL, он должен указывать на путь EXE. –

+0

Вы даже не используете 'env' в представленном здесь' _spawnvpe' вызове. –

ответ

2

Это работает для меня следующим кодом (только измененные строки показаны):

... 
const char *args[2]; 
... 
args[0] = "notepad.exe"; 
args[1] = NULL; 
... 
procHandle = _spawnvpe(_P_NOWAIT, command, args, env); 
... 

Visual Studio 2010, Windows HPC Server 2008 R2.

Обратите внимание, что Windows ищет программы И динамических библиотек в PATH в отличие от большинства систем Unix, которые имеют отдельные переменные для исполняемых и путей библиотек.

+0

^____^ты только что сделал меня очень счастливым. Благодаря! – Doug

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