У меня небольшая путаница из-за противоречивых возвращаемых значений от CreateProcess()
и GetLastError()
. Когда я использую CreateProcess()
способом, подобным приведенному ниже, он преуспевает и, кажется, выполняет свои требуемые задачи. Тем не менее, GetLastError()
по-прежнему возвращает сообщение «Отказано в доступе».
Если в доступе отказано, почему появляется возможность выполнить задачу. Напротив, если CreateProcess()
завершается успешно, почему GetLastError()
возвращает отказ в доступе?
Или я неправильно использую GetLastError()
? Я должен использовать его только тогда, когда CreateProcess()
возвращает ошибочное значение? (Мое оправдание приведенного ниже поведения заключалось в том, что я решил, что лучше перестраховаться, чем сожалеть)
SetLastError(0);
hello = CreateProcess(_T("C:\\Windows\\System32\\cmd.exe"),
_T("C:\\Windows\\System32\\cmd.exe /C ant debug"),
NULL,NULL,false,0,NULL,
_T("C:\\My\\Directory"),&siStartupInfo, &piProcessInfo);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER
|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText, 0, NULL);
AfxMessageBox(errorText);
Является ли такой тип поведения нормальным? В документации CreateProcess()
упоминается использование GetLastError()
при сбое CreateProcess()
, но не упоминается обратное. Не критикуя документацию, просто хотелось бы пояснений.
Это происходит независимо от того, равен ли второй параметр в CreateProcess()
NULL
или нет. Может быть, это связано с cmd.exe
разрешениями? Если это так, не должен ли CreateProcess()
потерпеть неудачу? Спасибо.
GetLastError
неправильно. Вы должны использовать его только тогда, когдаCreateProcess
терпит неудачу.CreateProcess
может (и использует) использовать API, которые могут установить последнюю ошибку, и он не обязан сбрасывать ее на 0, поскольку возвращает значение, указывающее на успех. - person Erik   schedule 18.06.2012