Здравствуйте, agendus, Вы писали:
A>Добрый день. Пытаюсь запустить процесс:
что такое pc_fName1 и pc_fName2, у которых вы ЯВНО, РУКАМИ снимаете константность ?
LPTSTR lpCommandLine,
Этот указатель не может указывать на константную строку, т.к. внутри CreateProcess активно хачит переданный буфер нулями в места с пробелами. Чтобы разделить CommandLine на имя процесса и список параметров. Если ваши переменные это Си-строки — они лежат в ReadOnly секции PEфайла. И ручной каст никак этот факт не отменяет. Соответственно при доступе на запись будет AV, ничего удивительного.
kalsarikännit
CreateProcess - Access Violation при запуске процесса
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 в случае релизной сборки с дефолтовыми настройками. А в случае дебажной кстати — в них можно писать)
CreateProcess - Access Violation при запуске процесса
При выполнении 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 при запуске процесса
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? и то же самое. Помогите пожалуйста