Как создать дочерний процесс с теми же переменными окружения, что и parrent, плюс свой собственный в Windows?

#c #c #winapi #environment-variables

#c #c #winapi #переменные окружения

Вопрос:

В Windows для создания нового дочернего процесса я использую CreateProcess функцию:

 BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);
  

Здесь мы можем видеть, что CreateProcess можно получить lpEnvironment параметр для указания переменных окружения нового процесса, и если он равен NULL, дочерний процесс будет иметь ту же среду, что и parrent. Теперь я хочу, чтобы у дочернего процесса была та же среда, что и у parrent, плюс переменные окружения, указанные в lpEnvironment (т. е. объединенная среда родительского процесса и указанных). Как бы вы предложили это сделать? Должен ли я взять все среды родительского процесса, объединить их с новыми и передать их все CreateProcess ?

Ответ №1:

Я думаю, вы на правильном пути. Получите существующий блок env, добавьте свой новый материал, передайте его в функцию CreateProcess, затем уничтожьте новый блок env.

Чтобы получить текущий блок, используйте GetEnvironmentStrings. Добавление новых переменных вам, вероятно, придется выполнять с помощью простых манипуляций со строками. Блок окружения — это просто последовательность строк, заканчивающихся нулем, с двойным нулем в конце, как описано здесь. Возможно, вам захочется сначала проверить, добавляете ли вы новую переменную env или обновляете существующую, в случае, если она уже определена.

Ответ №2:

используйте getenv, чтобы получить crt env, добавьте свой собственный и установите

Комментарии:

1. Но как я могу использовать getenv(), если я не знаю, какие env существуют на самом деле?

2. Возвращаемое значение равно НУЛЮ, если varname не найдено в таблице окружения. Если вас интересует конкретное значение, обозначьте и сравните

3. Я заинтересован в получении всех окружений. В этом случае я не думаю, что getenv мне поможет.

4. Должны помочь GetEnvironmentStrings ( msdn.microsoft.com/en-us/library/ms683187 (v = vs.85).aspx ). Примечания к чтению