Как выглядит блок среды UNICODE для запуска нового процесса с помощью CreateProcessW () в Windows? - PullRequest
0 голосов
/ 12 ноября 2010

По сути, я хотел бы создать новый процесс и определить среду для него из родительского процесса.Я хотел бы использовать CreateProcessW и передать (измененную) среду UNICODE в lpEnvironment, но я не уверен, как должен выглядеть контент по сравнению с блоком среды ANSII.

Единственная документация, которую я действительно нашел, находится на MSDN:

Обратите внимание, что блок среды ANSI завершается двумя нулевыми байтами: один для последней строки, еще один для завершения блока.Блок среды Unicode завершается четырьмя нулевыми байтами: два для последней строки, еще два для завершения блока.

Теперь я попытался

  1. вызвать GetEnvironmentStringsи передать его дочернему процессу
  2. call GetEnvironmentStringsW и передать его дочернему процессу
  3. , изменить эти блоки с моими дополнительными строками среды и передать его на

ни один из них не работает

Я действительно мог бы установить lpEnvironment на NULL, чтобы заставить его работать, но теперь мне пришлось бы изменить и вернуть среду обработки моих родителей - это путьздесь?

(я также установил CREATE_UNICODE_ENVIRONMENT)

Может кто-нибудь сказать, что такого особенного в UNICODE блоках среды - это работало, когда я просто использовал ASCIIвещи и звоните CreateProcessA() ...

1 Ответ

1 голос
/ 12 ноября 2010

Понятия не имею, что вы делаете неправильно без кода.Но это работает:

STARTUPINFO startInfo = {0};
PROCESS_INFORMATION procInfo = {0};

WCHAR env[] = L"key=value\0key2=value2\0\0";
WCHAR cmdline[] = L"calc";

startInfo.cb = sizeof(startInfo);
if(!CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, env, NULL, &startInfo, &procInfo))
{
    printf("Error %d\n", GetLastError());
}

Возможно, это даст вам представление о том, что вы делаете неправильно.

...