CreateProcess in Visual Studio 6.0

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
AvA
Сообщения: 2
Зарегистрирован: 26 сен 2007, 09:30

CreateProcess in Visual Studio 6.0

Сообщение AvA » 26 сен 2007, 09:37

Доброго времени суток!

Есть код

Код: Выделить всё

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)..
Возник вопрос - почему нет доступа к файлу? Есть какие-то идеи?..

Заранее благодарен :cool:

Аватара пользователя
WinMain
Сообщения: 912
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Re: CreateProcess in Visual Studio 6.0

Сообщение WinMain » 26 сен 2007, 11:07

Для запуска приложений есть более простые в использовании функции, например WinExec() или ShellExecute()
Приглашаю на свой сайт http://winmain.org

AvA
Сообщения: 2
Зарегистрирован: 26 сен 2007, 09:30

Re: CreateProcess in Visual Studio 6.0

Сообщение AvA » 26 сен 2007, 12:38

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 уже заработал, пробема была в необнулённых структурах ;-)

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Re: CreateProcess in Visual Studio 6.0

Сообщение Absurd » 27 сен 2007, 11:31

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)..
Возник вопрос - почему нет доступа к файлу? Есть какие-то идеи?..

Заранее благодарен :cool:
Попробуй передавать оба параметра - и бинарь, и коммандную строку. У меня с одним параметром почему-то никогда не работало.
Для запуска приложений есть более простые в использовании функции, например WinExec() или ShellExecute()
Надоел уже влезать везде со своим WinExec().
2B OR NOT(2B) = FF

DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Re: CreateProcess in Visual Studio 6.0

Сообщение DeeJayC » 27 сен 2007, 12:59

Absurd, Зато WinExec работает без всяких головных болей.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Re: CreateProcess in Visual Studio 6.0

Сообщение Absurd » 27 сен 2007, 13:40

DeeJayC писал(а):Absurd, Зато WinExec работает без всяких головных болей.
Она основана на CreateProcess. Все равно в процессе отладки полезут косяки с наследованием хендлов, с секьюрити итд. Лучше сразу взять функцию которая продоставляет все возможные опции.
2B OR NOT(2B) = FF

Аватара пользователя
WinMain
Сообщения: 912
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Re: CreateProcess in Visual Studio 6.0

Сообщение WinMain » 27 сен 2007, 23:42

Ещё есть семейство функций exec() и spawn() из стандартной библиоотеки С/С++, но они так же внутри себя реализуют вызов функции CreateProcess(). Их имеет смысл использовать в кросс-платформенных проектах для написания переносимого кода, т.к. они соответствуют стандарту POSIX.
Приглашаю на свой сайт http://winmain.org

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Re: CreateProcess in Visual Studio 6.0

Сообщение Absurd » 28 сен 2007, 12:53

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 нету.
2B OR NOT(2B) = FF

Ответить