#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 ). Примечания к чтению