Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Создание процесса


Автор: maxi91m 21.1.2010, 21:27
Код компилируется но блокнот не запускается. Что я делаю не так?(ОС Win7)
Код

#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;



int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR buff[MAX_PATH];
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si,sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    _tcscpy(buff, TEXT("C:\Windows\notepad.exe"));
    if(!CreateProcess(NULL,buff,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
    {
        cout << "The new process is not created." << endl
            << "Check a name of the process." << endl;
    return 0;
    }

    Sleep(1000);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);

    return 0;
}
[quote]

[/quote]

 smile 

Автор: artsb 21.1.2010, 21:35
А так:
Код

_tcscpy(buff, TEXT("C:\\Windows\\notepad.exe"));

?

Автор: maxi91m 21.1.2010, 21:39
Да так заработало.  Блин а почему с одним слешем не работает? 
А почему нельзя так написать?
CreateProcess(NULL,"C:\\Windows\\notepad.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)
Возникает ошибка  Error    1    error C2664: 'CreateProcessW' : cannot convert parameter 2 from 'const char [23]' to 'LPWSTR'    
Если явно преобразовываю 
CreateProcess(NULL,(LPWSTR)"C:\\Windows\\notepad.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)
то запускается но на этом месте возникает какая то ошибка
Что делает волшебного  _tcscpy(buff, TEXT("C:\Windows\notepad.exe"));

Автор: artsb 21.1.2010, 21:42
Цитата(maxi91m @  21.1.2010,  21:39 Найти цитируемый пост)
а почему с одним слешем не работает?  

Спецсимвол. Нужно экранировать.

Автор: maxi91m 21.1.2010, 22:29
Что скажите?(см пост выше)

Автор: bilbobagginz 21.1.2010, 22:56
Цитата(maxi91m @  21.1.2010,  20:39 Найти цитируемый пост)
Блин а почему с одним слешем не работает? 

потому что напр. "\n" - это на Си - переход на новую строку.

Автор: artsb 21.1.2010, 23:49
Цитата(maxi91m @  21.1.2010,  22:29 Найти цитируемый пост)
Что скажите?(см пост выше) 

\ - служит для экранирования. А вот чтобы использовать сам символ '\', нужно его заэкранировать.

Автор: maxi91m 22.1.2010, 01:23
Со слешами разобрались, а вот почему когда я просто строку передаю не работает?

Автор: GremlinProg 22.1.2010, 06:30
Цитата(maxi91m @  21.1.2010,  23:39 Найти цитируемый пост)
Что делает волшебного  _tcscpy(buff, TEXT("C:\\Windows\\notepad.exe"));

волшебство в данном случае делает макрос TEXT, а не _tcscpy,
а константную строку нельзя передавать напрямую в CreateProcess потому что она может подвергаться изменениям:
Цитата(CreateProcess Function @  MSDN)

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.

Автор: artsb 22.1.2010, 09:47
maxi91m, сори smile я не заметил, что ты пост отредактировал и подумал, что ты меня не понял  smile 
Ну GremlinProg уже написал в чём дело.

Автор: Dem_max 22.1.2010, 16:36
макрос TEXT
у тебя проект в UNICODE а ты свою строку в CreateProcess пишешь как char, а в юникоде строки определяются как widechar.
в винде существую 2 функции одна для юникода CreateProcessW, а другая для обычных строк CreateProcessA, а CreateProcess это всего лишь макрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)