Страница 1 из 1
CreateProcess in Visual Studio 6.0
Добавлено: 26 сен 2007, 10:37
AvA
Доброго времени суток!
Есть код
Код: Выделить всё
if (!CreateProcess(
m_FileName,
NULL,
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi)
)
{
printf( "CreateProcess failed (%d)\n", GetLastError() );
return;
}
где m_FileName получает имя файла через Open dialog в Windows, но процесс не создаётся.. Error Code = 998 (ERROR_NOACCESS)..
Возник вопрос - почему нет доступа к файлу? Есть какие-то идеи?..
Заранее благодарен
Re: CreateProcess in Visual Studio 6.0
Добавлено: 26 сен 2007, 12:07
WinMain
Для запуска приложений есть более простые в использовании функции, например WinExec() или ShellExecute()
Re: CreateProcess in Visual Studio 6.0
Добавлено: 26 сен 2007, 13:38
AvA
WinMain писал(а):Для запуска приложений есть более простые в использовании функции, например WinExec() или ShellExecute()
Спасибо, за ответ, я тоже сначала ринулся было за WinExec поискав её описание в msdn и наткнулся на
WinExec Function
Runs the specified application.
Note This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function
Решил поверить Microsoft наслово.
P.S: CreateProcess уже заработал, пробема была в необнулённых структурах ;-)
Re: CreateProcess in Visual Studio 6.0
Добавлено: 27 сен 2007, 12:31
Absurd
AvA писал(а):Доброго времени суток!
Есть код
Код: Выделить всё
if (!CreateProcess(
m_FileName,
NULL,
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi)
)
{
printf( "CreateProcess failed (%d)\n", GetLastError() );
return;
}
где m_FileName получает имя файла через Open dialog в Windows, но процесс не создаётся.. Error Code = 998 (ERROR_NOACCESS)..
Возник вопрос - почему нет доступа к файлу? Есть какие-то идеи?..
Заранее благодарен
Попробуй передавать оба параметра - и бинарь, и коммандную строку. У меня с одним параметром почему-то никогда не работало.
Для запуска приложений есть более простые в использовании функции, например WinExec() или ShellExecute()
Надоел уже влезать везде со своим WinExec().
Re: CreateProcess in Visual Studio 6.0
Добавлено: 27 сен 2007, 13:59
DeeJayC
Absurd, Зато WinExec работает без всяких головных болей.
Re: CreateProcess in Visual Studio 6.0
Добавлено: 27 сен 2007, 14:40
Absurd
DeeJayC писал(а):Absurd, Зато WinExec работает без всяких головных болей.
Она основана на CreateProcess. Все равно в процессе отладки полезут косяки с наследованием хендлов, с секьюрити итд. Лучше сразу взять функцию которая продоставляет все возможные опции.
Re: CreateProcess in Visual Studio 6.0
Добавлено: 28 сен 2007, 00:42
WinMain
Ещё есть семейство функций exec() и spawn() из стандартной библиоотеки С/С++, но они так же внутри себя реализуют вызов функции CreateProcess(). Их имеет смысл использовать в кросс-платформенных проектах для написания переносимого кода, т.к. они соответствуют стандарту POSIX.
Re: CreateProcess in Visual Studio 6.0
Добавлено: 28 сен 2007, 13:53
Absurd
WinMain писал(а):Ещё есть семейство функций exec() и spawn() из стандартной библиоотеки С/С++, но они так же внутри себя реализуют вызов функции CreateProcess(). Их имеет смысл использовать в кросс-платформенных проектах для написания переносимого кода, т.к. они соответствуют стандарту POSIX.
Нормальный exec() 2 my mind вытесняет текущий процесс из памяти, а не запускает новый. На UNIX порождение нового процесса и загрузка программы - это две разные вещи. Процесс порождается при помощи fork(), при этом текущий процесс дублируется, потом грузится новая программа при помощи exec(), старая вытесняется из памяти.
Код: Выделить всё
pid_t pid;
if (pid = fork()) { /*If pid is not equal to 0 then we are child*/
exec("new program"); /* new program will replace child process */
}
В Windows эти две вещи склеены воедино в лице CreateProcess(), так что полноценного POSIX exec() в Win32 нету.