При выполнении CreateProcess случается Access Violation. Почему?! Сначала думал, что из-за того, что не обнулял procinfo — стал обнулять ZeroMemory? и то же самое. Помогите пожалуйста
23.05.09 16:46: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: CreateProcess - Access Violation при запуске процесса
A> PROCESS_INFORMATION procinfo;
A> ZeroMemory( &procinfo, sizeof(procinfo) );
A> if ( CreateProcess(pszImageName, pszCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
A> NULL, NULL, NULL, &procinfo)
A>
A>При выполнении CreateProcess случается Access Violation. Почему?! Сначала думал, что из-за того, что не обнулял procinfo — стал обнулять ZeroMemory? и то же самое. Помогите пожалуйста
lpStartupInfo [in]
A pointer to a STARTUPINFO or STARTUPINFOEX structure.
To set extended attributes, use a STARTUPINFOEX structure and specify EXTENDED_STARTUPINFO_PRESENT in the dwCreationFlags parameter.
---
С уважением,
Сергей Мухин
Re[2]: CreateProcess - Access Violation при запуске процесса
A>>При выполнении CreateProcess случается Access Violation. Почему?! Сначала думал, что из-за того, что не обнулял procinfo — стал обнулять ZeroMemory? и то же самое. Помогите пожалуйста
СМ>lpStartupInfo [in] СМ>A pointer to a STARTUPINFO or STARTUPINFOEX structure.
СМ>To set extended attributes, use a STARTUPINFOEX structure and specify EXTENDED_STARTUPINFO_PRESENT in the dwCreationFlags parameter.
Тогда почему MSDN 2008 говорит:
psiStartInfo
[in] Not supported; set to NULL.
Re[3]: CreateProcess - Access Violation при запуске процесса
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, agendus, Вы писали:
A>>Тогда почему MSDN 2008 говорит: A>>
A>>psiStartInfo
A>>[in] Not supported; set to NULL.
СМ>это другая тема. Где Вы это нашли? Судя по имени psi,,, это не MSDN. У меня в MSDN 2008 написано так же как и на сайте
СМ>здесь пользуйтесь сайтом. там самая свежая информация. СМ>Хотя CreateProcess не менялся давно.
Спасибо.
Теперь ошибки нет, вот только процесс не запускается все равно. Система типа не может найти указанный путь.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, agendus, Вы писали:
A>>Теперь ошибки нет, вот только процесс не запускается все равно. Система типа не может найти указанный путь.
СМ>ну это уж сами. проверьте пути, установите полный путь в имени файла. смотрите переменную среды path, читайте как ищет CreateProcess
хОРОШО, СПАСИБО ЗА УЧАСТИЕ
Re: CreateProcess - Access Violation при запуске процесса
Старая, как мир, проблема
Ты передаешь в качестве параметра CreateProcess указатель на стэковый объект. После выполнения CreateProcess выполнение продолжается, при выходе из скопа procinfo разрушается, и в потоковой функции остается невалидный указатель.
B>Старая, как мир, проблема B>Ты передаешь в качестве параметра CreateProcess указатель на стэковый объект. После выполнения CreateProcess выполнение продолжается, при выходе из скопа procinfo разрушается, и в потоковой функции остается невалидный указатель.
Вы наверно перепутали с CreateThread
---
С уважением,
Сергей Мухин
Re[5]: CreateProcess - Access Violation при запуске процесса
Здравствуйте, agendus, Вы писали:
A>Спасибо. A>Теперь ошибки нет, вот только процесс не запускается все равно. Система типа не может найти указанный путь.
A>
A>pszImageName = (LPCWSTR)"excel.exe";
A>
мне это с самого начала показалось подозрительным.
поди UNICODE включен, а Вы такое преобразование делаете. иначе зачем так жестоко.
если pszImageName это TCHAR * или LPCTSTR или LPCWSTR, то попробуйте так
pszImageName = L"excel.exe";
Re[3]: CreateProcess - Access Violation при запуске процесса
Здравствуйте, agendus, Вы писали:
A>Добрый день. Пытаюсь запустить процесс:
что такое pc_fName1 и pc_fName2, у которых вы ЯВНО, РУКАМИ снимаете константность ?
LPTSTR lpCommandLine,
Этот указатель не может указывать на константную строку, т.к. внутри CreateProcess активно хачит переданный буфер нулями в места с пробелами. Чтобы разделить CommandLine на имя процесса и список параметров. Если ваши переменные это Си-строки — они лежат в ReadOnly секции PEфайла. И ручной каст никак этот факт не отменяет. Соответственно при доступе на запись будет AV, ничего удивительного.
1. Функция CreateProcess возвращает success до полной инициализации вызываемого процесса(со всеми вытекающими).
Если вы хотите, чтобы вызывающий процесс взаимодействовал с вызываемым, следует использовать функцию WaitForInputIdle для того, чтобы подождать завершения инициализации.
2. Первым параметром функции всегда укаказывайте полныий путь к фаилу, иначе это приведет к нарушению безопасности.
Например:
Если путь к приложению указать как NULL, а в командной строке содержится пробел в пути к приложению, возможно выполнение не того приложения.
То поиск фаила будет опреселен следующим сценарием:
* Текущий каталог.
* Системный каталог.
* 16-разрядный системный каталог. Функции, которая получает путь к этому каталогу нет, но он ищется.
Windows Me/98/95: Этот каталог не существует.
* Каталог Windows.
* Каталоги, которые внесены в список в переменной окружения PATH.
Пологается, что notepad.exe находится в system32, но если в текущий каталог подбросить приложение переименнованное как notepad.exe, то запустится именно оно.
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Здравствуйте, meerius, Вы писали:
LPCTSTR pszCmdLine — здесь неверно, следсвие копипеста, но об этом слазали уже выше.
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[5]: CreateProcess - Access Violation при запуске процесса
От:
Аноним
Дата:
23.05.09 13:55
Оценка:
Здравствуйте, agendus, Вы писали:
A>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>Здравствуйте, agendus, Вы писали:
A>>>Тогда почему MSDN 2008 говорит: A>>>
A>>>psiStartInfo
A>>>[in] Not supported; set to NULL.
СМ>>это другая тема. Где Вы это нашли? Судя по имени psi,,, это не MSDN. У меня в MSDN 2008 написано так же как и на сайте
СМ>>здесь пользуйтесь сайтом. там самая свежая информация. СМ>>Хотя CreateProcess не менялся давно.
A>Спасибо. A>Теперь ошибки нет, вот только процесс не запускается все равно. Система типа не может найти указанный путь.
A>
A>pszImageName = (LPCWSTR)"excel.exe";
A>STARTUPINFO si;
A> PROCESS_INFORMATION procinfo;
A> ZeroMemory( &si, sizeof(si) );
A> si.cb = sizeof(si);
A> ZeroMemory( &procinfo, sizeof(procinfo) );
A> if ( CreateProcess(pszImageName, NULL/*pszCmdLine*/, NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
A> NULL, NULL, &si, &procinfo)
A> )
A> {
A> CloseHandle(procinfo.hThread);
A> CloseHandle(procinfo.hProcess);
A> }
A> else
A> {
A> LPVOID lpMsgBuf;
A> FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
A> FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
A> 0, // Default language
A> (LPTSTR) &lpMsgBuf, 0, NULL
A> );
A> CString szCaption;
A> szCaption.LoadString(IDS_ERRMSG);
A> ::MessageBox( NULL, (LPCTSTR)lpMsgBuf, (LPCTSTR)szCaption, MB_OK | MB_ICONINFORMATION );
A> LocalFree( lpMsgBuf );
A> }
A>
Про путь Вам уже сказали, в добавление — пара замечаний. PROCESS_INFORMATION обнулять не обязательно, это выходная структура и её содержимое на входе ни на что не влияет. И второе, несколько странным выглядит использование CREATE_NEW_CONSOLE для запуска excel.exe. Даже если Ваше приложение консольное, то экселю-то консоль зачем? Она и не будет создаваться, а флаг, получается, бессмысленный.
И то, и другое ошибок не вызовет, но действовать лучше всё-таки осмысленно.
Re: CreateProcess - Access Violation при запуске процесса
Здравствуйте, agendus, Вы писали: A>При выполнении CreateProcess случается Access Violation. Почему?! Сначала думал, что из-за того, что не обнулял procinfo — стал обнулять ZeroMemory? и то же самое. Помогите пожалуйста
A>>При выполнении CreateProcess случается Access Violation. Почему?! Сначала думал, что из-за того, что не обнулял procinfo — стал обнулять ZeroMemory? и то же самое. Помогите пожалуйста X>Об этом писал Рихтер.
Об это МСДН пишет. http://msdn.microsoft.com/en-us/library/ms682425.aspx
The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
а переменные типа LPWSTR s = L"blablabla" — являются на самом деле указателями на read-only memory в случае релизной сборки с дефолтовыми настройками. А в случае дебажной кстати — в них можно писать)