2016-01-06 6 views
0

Я пытаюсь использовать msdn function (CreateProcess) на C++ для запуска приложения. Я не получаю никаких ошибок, но когда я запускаю его, он падает. Я также заметил, что он создал процесс, но он не запускал текстовый файл, который он должен был использовать.Сбой при создании процесса

Мой код:

#include <windows.h> 
#include <iostream> 
#include <string> 

using namespace std; 

void createPro(); 

int main() 
{ 
    createPro(); 
} 

void createPro() { 

    LPCTSTR lpApplicationName = "C:/Users/Andyy/Desktop/hello.txt"; 

    LPSTARTUPINFO lpStartupInfo; 
    LPPROCESS_INFORMATION lpProcessInfo; 

    memset(&lpStartupInfo, 0, sizeof(lpStartupInfo)); 
    memset(&lpProcessInfo, 0, sizeof(lpProcessInfo)); 


    if (!CreateProcess(lpApplicationName, 
        NULL, NULL, NULL, 
        NULL, NULL, NULL, NULL, 
        lpStartupInfo, 
        lpProcessInfo 
       ) 
    ) { 
    cout << "Failed to create process" << lpApplicationName << endl; 
} 

    cout << "Program exec: " << lpApplicationName << endl; 
} 

Это создает процесс, но он не может запустить текстовый файл и никаких ошибок не показали в компиляторах. Заранее спасибо. Возврат ошибки: Обработанный процесс -1073741819 (0xC0000005)

+0

Ваше имя 'lpApplicationName' должно быть именем исполняемого файла. Вместо этого он ссылается на текстовый файл, и 'CreateProcess', вероятно, терпит неудачу, потому что невозможно выполнить текстовый файл. Может быть, описать словами, что вы пытаетесь сделать? – kfx

+0

"Сбой". Нет, это не сбой. Сбой - это аномальное завершение процесса из-за необработанной, непонятной ошибки. Игнорирование возвращаемого значения не приводит к завершению процесса. – MSalters

+0

Я пробовал с исполняемым файлом, и он тоже не работал. (Err: команда консоли Windows остановлена) – Andy

ответ

5

CreateProcess используется для создания объектов процесса из исполняемых файлов. Вы передаете текстовый файл, который не является исполняемым файлом. Предположительно, вы на самом деле пытаетесь показать текстовый файл в текстовом редакторе по умолчанию. Для этого используйте ShellExecuteEx.


Кроме того, вы не выделяют два структур, которые необходимы при вызове CreateProcess. Вместо этого вы указываете указатели на структуры и оставляете указатель неинициализированным. Я ожидаю, что это является причиной ошибки нарушения доступа 0xC0000005. Для дальнейшего использования, вы бы выделить и инициализирует эти структур, как так:

STARTUPINFO StartupInfo = { sizeof StartupInfo }; 
PROCESS_INFORMATION ProcessInfo = { 0 }; 

Затем пройти &StartupInfo и &ProcessInfo к CreateProcess. Конечно, я просто добавляю этот совет для полноты. Вы выбросите весь код, относящийся к CreateProcess, и вместо этого вызовите ShellExecuteEx.

+0

Спасибо большое за ответ. Поэтому я изменил имя lpApplicationName на место назначения exe и получил ту же ошибку. Я также попытался объявить указатели на структуры, но все же неожиданно закрыл. – Andy

+0

Не используйте 'CreateProcess' для открытия текстового файла. Используйте «ShellExecuteEx». Если у вас есть новый вопрос, спросите его как таковой. Пожалуйста, не ожидайте длинной сессии отладки через комментарии. –

+0

Ладно, спасибо, я не мог заставить эту функцию работать, поэтому я, вероятно, искал что-то еще, что не инвл. System(); (PD: Я действительно хотел запустить .exe. Я просто использовал неправильный пример, чтобы опубликовать его lol) – Andy

Смежные вопросы