CreateProcess - Access Violation при запуске процесса
От: agendus  
Дата: 22.05.09 06:46
Оценка:
Добрый день. Пытаюсь запустить процесс:

LPCWSTR pszImageName;
        LPWSTR pszCmdLine;
        
        pf = fopen(pc_fName1, "rb");
        if (!pf) 
        {
            pf = fopen(pc_fName2, "rb");
            if (pf)
            {
                pszImageName = (LPCWSTR)"notepad.exe";
                pszCmdLine = (LPWSTR)pc_fName2;
                fclose(pf);
            }
        }
        else
        {
            pszImageName = (LPCWSTR)"excel.exe";
            pszCmdLine = (LPWSTR)pc_fName1;
            fclose(pf);
        }

        PROCESS_INFORMATION procinfo;
        ZeroMemory( &procinfo, sizeof(procinfo) );
        if ( CreateProcess(pszImageName, pszCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
                      NULL, NULL, NULL, &procinfo)
                      )
        {
            CloseHandle(procinfo.hThread);
            CloseHandle(procinfo.hProcess);
        }

При выполнении CreateProcess случается Access Violation. Почему?! Сначала думал, что из-за того, что не обнулял procinfo — стал обнулять ZeroMemory? и то же самое. Помогите пожалуйста


23.05.09 16:46: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: CreateProcess - Access Violation при запуске процесса
От: Сергей Мухин Россия  
Дата: 22.05.09 06:50
Оценка:
Здравствуйте, agendus, Вы писали:


A>
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 при запуске процесса
От: agendus  
Дата: 22.05.09 06:54
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, agendus, Вы писали:



A>>
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.


Тогда почему MSDN 2008 говорит:

psiStartInfo
[in] Not supported; set to NULL.

Re[3]: CreateProcess - Access Violation при запуске процесса
От: Сергей Мухин Россия  
Дата: 22.05.09 07:00
Оценка:
Здравствуйте, agendus, Вы писали:

A>Тогда почему MSDN 2008 говорит:

A>

A>psiStartInfo
A>[in] Not supported; set to NULL.


это другая тема. Где Вы это нашли? Судя по имени psi,,, это не MSDN. У меня в MSDN 2008 написано так же как и на сайте

здесь пользуйтесь сайтом. там самая свежая информация.
Хотя CreateProcess не менялся давно.
---
С уважением,
Сергей Мухин
Re[4]: CreateProcess - Access Violation при запуске процесса
От: agendus  
Дата: 22.05.09 07:07
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, agendus, Вы писали:


A>>Тогда почему MSDN 2008 говорит:

A>>

A>>psiStartInfo
A>>[in] Not supported; set to NULL.


СМ>это другая тема. Где Вы это нашли? Судя по имени psi,,, это не MSDN. У меня в MSDN 2008 написано так же как и на сайте


СМ>здесь пользуйтесь сайтом. там самая свежая информация.

СМ>Хотя CreateProcess не менялся давно.

Спасибо.
Теперь ошибки нет, вот только процесс не запускается все равно. Система типа не может найти указанный путь.

pszImageName = (LPCWSTR)"excel.exe";
STARTUPINFO si;
        PROCESS_INFORMATION procinfo;
        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &procinfo, sizeof(procinfo) );
        if ( CreateProcess(pszImageName, NULL/*pszCmdLine*/, NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
                      NULL, NULL, &si, &procinfo)
                      )
        {
            CloseHandle(procinfo.hThread);
            CloseHandle(procinfo.hProcess);
        }
        else
        {
            LPVOID lpMsgBuf;
            FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
                           FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
                           0, // Default language
                           (LPTSTR) &lpMsgBuf, 0, NULL 
                         );
            CString szCaption;
            szCaption.LoadString(IDS_ERRMSG);
            ::MessageBox( NULL, (LPCTSTR)lpMsgBuf, (LPCTSTR)szCaption, MB_OK | MB_ICONINFORMATION );
            LocalFree( lpMsgBuf );
        }
Re[5]: CreateProcess - Access Violation при запуске процесса
От: Сергей Мухин Россия  
Дата: 22.05.09 07:11
Оценка:
Здравствуйте, agendus, Вы писали:

A>Теперь ошибки нет, вот только процесс не запускается все равно. Система типа не может найти указанный путь.


ну это уж сами. проверьте пути, установите полный путь в имени файла. смотрите переменную среды path, читайте как ищет CreateProcess
---
С уважением,
Сергей Мухин
Re[6]: CreateProcess - Access Violation при запуске процесса
От: agendus  
Дата: 22.05.09 07:20
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, agendus, Вы писали:


A>>Теперь ошибки нет, вот только процесс не запускается все равно. Система типа не может найти указанный путь.


СМ>ну это уж сами. проверьте пути, установите полный путь в имени файла. смотрите переменную среды path, читайте как ищет CreateProcess



хОРОШО, СПАСИБО ЗА УЧАСТИЕ
Re: CreateProcess - Access Violation при запуске процесса
От: Bell Россия  
Дата: 22.05.09 07:33
Оценка:
Здравствуйте, agendus, Вы писали:

A>Добрый день. Пытаюсь запустить процесс:


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)


Старая, как мир, проблема
Ты передаешь в качестве параметра CreateProcess указатель на стэковый объект. После выполнения CreateProcess выполнение продолжается, при выходе из скопа procinfo разрушается, и в потоковой функции остается невалидный указатель.

Лечить, например, так:
PROCESS_INFORMATION* procinfo = new PROCESS_INFORMATION();
ZeroMemory( procinfo, sizeof(PROCESS_INFORMATION) );
if ( CreateProcess(pszImageName, pszCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
          NULL, NULL, NULL, procinfo)


Динамический объект должен быть удален в потоковой функции.
Любите книгу — источник знаний (с) М.Горький
Re[2]: CreateProcess - Access Violation при запуске процесса
От: Сергей Мухин Россия  
Дата: 22.05.09 07:41
Оценка:
Здравствуйте, Bell, Вы писали:

A>>Добрый день. Пытаюсь запустить процесс:


B>
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)
B>


B>Старая, как мир, проблема

B>Ты передаешь в качестве параметра CreateProcess указатель на стэковый объект. После выполнения CreateProcess выполнение продолжается, при выходе из скопа procinfo разрушается, и в потоковой функции остается невалидный указатель.

Вы наверно перепутали с CreateThread
---
С уважением,
Сергей Мухин
Re[5]: CreateProcess - Access Violation при запуске процесса
От: _Dreamer Россия  
Дата: 22.05.09 07:52
Оценка:
Здравствуйте, agendus, Вы писали:

A>Спасибо.

A>Теперь ошибки нет, вот только процесс не запускается все равно. Система типа не может найти указанный путь.

A>
A>pszImageName = (LPCWSTR)"excel.exe";
A>


мне это с самого начала показалось подозрительным.
поди UNICODE включен, а Вы такое преобразование делаете. иначе зачем так жестоко.
если pszImageName это TCHAR * или LPCTSTR или LPCWSTR, то попробуйте так
pszImageName = L"excel.exe";
Re[3]: CreateProcess - Access Violation при запуске процесса
От: Bell Россия  
Дата: 22.05.09 07:57
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:


СМ>Вы наверно перепутали с CreateThread


Точно
Любите книгу — источник знаний (с) М.Горький
Re: CreateProcess - Access Violation при запуске процесса
От: IID Россия  
Дата: 22.05.09 08:28
Оценка: 1 (1) +4
Здравствуйте, agendus, Вы писали:

A>Добрый день. Пытаюсь запустить процесс:


что такое pc_fName1 и pc_fName2, у которых вы ЯВНО, РУКАМИ снимаете константность ?

LPTSTR lpCommandLine,


Этот указатель не может указывать на константную строку, т.к. внутри CreateProcess активно хачит переданный буфер нулями в места с пробелами. Чтобы разделить CommandLine на имя процесса и список параметров. Если ваши переменные это Си-строки — они лежат в ReadOnly секции PEфайла. И ручной каст никак этот факт не отменяет. Соответственно при доступе на запись будет AV, ничего удивительного.
kalsarikännit
Re: Offtop
От: meerius Канада  
Дата: 23.05.09 10:12
Оценка:
Полезная информация:

1. Функция CreateProcess возвращает success до полной инициализации вызываемого процесса(со всеми вытекающими).
Если вы хотите, чтобы вызывающий процесс взаимодействовал с вызываемым, следует использовать функцию WaitForInputIdle для того, чтобы подождать завершения инициализации.

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

Например:

Если путь к приложению указать как NULL, а в командной строке содержится пробел в пути к приложению, возможно выполнение не того приложения.
LPCTSTR pszCmdLine = T("С:\Progrаm files\sub dir\MyApp.exe");
CreateProcess(NULL,pszCmdLine, ... );

Tо при наличии соответствующего файла выполнится программа C:\Progrаm.ехе или С:\Progrаm files\sub.exe.

Если путь к приложению указан не полностью (только имя фаила), то тоже возможно выполнение не того приложения.
LPCTSTR pszImageName= T("notepad.exe");
CreateProcess(pszImageName, ... );

То поиск фаила будет опреселен следующим сценарием:
* Текущий каталог.
* Системный каталог.
* 16-разрядный системный каталог. Функции, которая получает путь к этому каталогу нет, но он ищется.
Windows Me/98/95: Этот каталог не существует.
* Каталог Windows.
* Каталоги, которые внесены в список в переменной окружения PATH.
Пологается, что notepad.exe находится в system32, но если в текущий каталог подбросить приложение переименнованное как notepad.exe, то запустится именно оно.
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[2]: Offtop
От: meerius Канада  
Дата: 23.05.09 10:20
Оценка:
Здравствуйте, 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 при запуске процесса
От: xmen  
Дата: 26.05.09 19:37
Оценка:
Здравствуйте, agendus, Вы писали:
A>При выполнении CreateProcess случается Access Violation. Почему?! Сначала думал, что из-за того, что не обнулял procinfo — стал обнулять ZeroMemory? и то же самое. Помогите пожалуйста

Об этом писал Рихтер.


...
#define UNICODE
...

    PROCESS_INFORMATION pi;
    STARTUPINFO si;
    
    ZeroMemory(&pi, sizeof(pi));
    ZeroMemory(&si, sizeof(si));

    si.cb = sizeof(si);

    WCHAR str[] = {'c', 'a', 'l', 'c', '\0'};

    CreateProcess(NULL, str, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi);
CreateProcess - Access Violation при запуске процесса
От: Аноним  
Дата: 27.05.09 07:18
Оценка: 1 (1)
#Имя: FAQ.winapi.createprocess.av
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 в случае релизной сборки с дефолтовыми настройками. А в случае дебажной кстати — в них можно писать)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.