C ++ LPTSTR проблема вызова CreateProcessAsUser с getenv - PullRequest
0 голосов
/ 02 июля 2011

Я пытаюсь вызвать функцию CreateProcessAsUser.Передача константы в порядке.Попытка выбрать переменную окружения с помощью char * getenv (const char name) вызывает у меня проблему.

Если я использую следующее, будет запускаться notepad.exe.

CreateProcessAsUser(hTokenDup, _T("c:\\windows\\notepad.exe"), 
                    _T("c:\\windows\\notepad.exe"), NULL, NULL, FALSE,
                    dwCreationFlag, pEnvironment, NULL, &si, &pi);

Однако, если я использую следующее, ничего не запускается.

CreateProcessAsUser(hTokenDup, _T("MyAppName"), 
                    (LPTSTR)getenv("MYENVVAR"), NULL, NULL, FALSE,
                    dwCreationFlag, pEnvironment, NULL, &si, &pi);

Правильно ли я указал getenv и (LPTSTR)?

Я пытался использовать переменные среды пользователя и системы, содержащие c: \\ windows\\ notepad.exe и c: \ windows \ notepad.exe.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Третий параметр lpCommandLine равен LPTSTR, что означает, что он должен быть записываемой памятью. Вам необходимо скопировать командную строку в строку для записи перед вызовом CreateProcessAsUser.

Документация для getenv гласит:

Не безопасно изменять значение переменной среды, используя возвращаемый указатель.

Поэтому вы не можете передать это как lpCommandLine параметр CreateProcessAsUser.

Ваш первый вызов CreateProcessAsUser также кажется неправильным, поскольку вы также не передаете доступную для записи память для lpCommandLine.

Конечно, скорее всего, ваша непосредственная проблема в том, что вы смешиваете ANSI и Unicode. Если ваше приложение - Unicode, вам нужно позвонить _wgetenv или _tgetenv, если вы действительно хотите настроить таргетинг на ANSI и Unicode из одного и того же источника. Но перед передачей убедитесь, что вы скопировали его в буфер для записи.

Наконец, как прокомментировал Адам, каждый раз, когда вы пишете актерский состав, существует большая вероятность того, что вы делаете ошибку.

0 голосов
/ 02 июля 2011

getenv () всегда будет возвращать символ * независимо от того, какой набор символов будет использовать ваше приложение.Попробуйте вместо этого использовать _tgetenv (), так как он настраивается между char * и wchar_t * по мере необходимости.

...