2013-03-21 2 views
2

После создания процесса и ожидания его завершения, STARTUPINFO все еще доступен или он уничтожен?Windows API STARTUPINFO уничтожен?

STARTUPINFO si; 

bRes = CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); 

dwRes = WaitForSingleObject(pi.hProcess, INFINITE); 

После этого делает si модифицируется/разрушен или он остается неизменным?

+0

Что вы имеете в виду? Можете ли вы показать какой-то код, чтобы он дал понять. –

+0

Я обновил вопрос. – coredump

+1

FYI, вы забыли инициализировать 'si.cb = sizeof (STARTUPINFO);'.Во всяком случае, ваш вопрос связан скорее с C/C++, чем с winapi. –

ответ

2

Windows создает копию структуры информации о запуске для нового процесса. Это должно произойти, потому что новый процесс имеет новое адресное пространство и не может видеть вашу структуру.

Теперь, что происходит с вашей структурой? Ну, ответ documentation. Параметр помечается как это:

_In_ LPSTARTUPINFO lpStartupInfo 

_In_ означает, что содержимое структуры не изменяются при вызове CreateProcess. Итак, вы можете быть уверены, что когда CreateProcess вернется, структура информации о запуске не была изменена.

+0

Спасибо! Я отчасти новичок в Windows API, поэтому я еще не очень хорошо знаком со всеми обозначениями. – coredump

0

копия STARTUPINFO, которую создает Windows, уничтожается. Но структура, которую вы предоставляете функции CreateProcess, все еще существует.

0

Если вы объявляете его, как вы делали

STARTUPINFO si; 

Тогда это разрушенный C, когда часть программы, в которой она была объявлена ​​отделками (это называется «выходит за рамки»). Например:

void myfunct() { 
    STARTUPINFO si1; 
    if (condition) { 
    STARTUPINFO si2; 
    //... 
    } //si2 destroyed here 
    //... 
} //si1 destroyed here 

Даже если CreateProcess() функция хотел сохранить SI1 или SI2, он не мог. Потому что независимо от того, что вы делаете, они будут уничтожены в этих точках.

Теперь, если вы создали си, как это:

STARTUPINFO *si = malloc(sizeof(STARTUPINFO)); 

Тогда он был бы уничтожен только тогда, когда вы явно назвать

free(si); 

Некоторые функции API требуют, чтобы дать им то, что они могут держать , Для этих функций вы должны выделять параметры вторым или даже более сложным способом, и они расскажут вам в документации, когда вам нужно будет ее позже уничтожить.

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

Обратите внимание, что в целом нехорошо «передавать что-то API и полагаться на API, разрушающий его». Ваши приложения и функции API, которые вы, скорее всего, используете для разных менеджеров памяти. То, что было выделено в одном, не может быть освобождено в другом.

Так что в большинстве случаев такой API захочет, чтобы вы либо распределяли данные, вызывая какую-то определенную функцию, либо (чаще) просто удаляли свои данные самостоятельно.

MYPARAM *p = malloc(sizeof(MYPARAM)); 
APIOpen(p); 
//...much later 
APIClose(p); 
//It's now safe to free p 
free(p); 
Смежные вопросы