1 Востаннє редагувалося #Sparta (19.04.2016 21:17:10)

Тема: CreateProcessA(). WIN API

Привіт усім, форумчани!
Останнім часом почав цікавитись WIN API (для загального розвитку :) ) .
Наразі почитав про FileMapping і приколи зв'язані з ним. Хотів спробувати реалізувати таке завдання: маємо файл(створений через CreateFile або ж відкритий ним же), записуємо туди якусь інформацію, створюємо FileMapping з якимось ім'ям і т.д.(це не суттєва частина - вона працює). Всі ці дії виконує перший процес. Другий же - відкриває, створений в першому процесі FileMapping , зчитує інформацію з того файлу і виводить на екран.
Так от , проблема в виклиці самого другого процесу. Не хоче працювати функція CreateProcessA(). Чому? Раніше, застосовуючи її аналогічним чином - все працювало корректно. Що не так? Підкажіть.
І ще одне , в MSDN error codes я прочитав , що  error code 2 - це "FILE_NOT_FOUND". Але ж він існує! *WALL*
Ось той кусочок коду:

STARTUPINFOA si = {sizeof(si)};
PROCESS_INFORMATION pi;

char cmdLn[BUFFER_SIZE];
sprintf(cmdLn, "%s %s ", "FileMapping_1_1",mapName); //mapName = "Mapping1" назва , яку дав при створенні
                                           //назва того процесу (проекту) в точності до символа = "FileMapping_1_1"
puts("Press any key to run the second process");
_getch();

if (!CreateProcessA("FileMapping_1_1.exe", cmdLn, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    std::cout << "Failed to run second process. Error : " << GetLastError() << std::endl;
WaitForSingleObject(pi.hProcess, INFINITY); 
Студент НУ "ЛП".

2

Re: CreateProcessA(). WIN API

Перевірте всі літери в назві файлу. Ви там ніде кирилицю не намішали?

Подякували: #Sparta1

3

Re: CreateProcessA(). WIN API

Пробіл в імені хвайлу, треба лапки додати

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: #Sparta1

4

Re: CreateProcessA(). WIN API

#Sparta
Чому не вказаний повний шлях до файла, який ви хочете запустити? Ви точно впевнені, що GetCurrentDirectory у цьому місці досі вказує туди, куди ви думаєте?
Чому ви використовуєте ансішну версію CreateProcess, у вас строки хіба не юнікодні за замовчуванням?

Подякували: 0xDADA11C7, #Sparta2

5 Востаннє редагувалося #Sparta (20.04.2016 23:23:50)

Re: CreateProcessA(). WIN API

koala написав:

Перевірте всі літери в назві файлу. Ви там ніде кирилицю не намішали?

Ні , все гаразд.

0xDADA11C7 написав:

Пробіл в імені хвайлу, треба лапки додати

Він там помилково поставлений вже під час редагування на форумі :)

Torbins написав:

Чому не вказаний повний шлях до файла, який ви хочете запустити? Ви точно впевнені, що GetCurrentDirectory у цьому місці досі вказує туди, куди ви думаєте?
Чому ви використовуєте ансішну версію CreateProcess, у вас строки хіба не юнікодні за замовчуванням?

Дякую, проблема дійсно була в GetCurrentDirectory і потрібен був весь шлях до файлу. Буду мати наувазі тепер:)
А чому ансішну? Ви самі дали відповідь на своє запитання. Користуюсь ANSI. Та й впринципі мені головною була суть :) Дякую усім за коментарі.

Студент НУ "ЛП".

6

Re: CreateProcessA(). WIN API

Якщо у вас строки ансішні, то ніяких проблем немає, треба юзати ансішну функцію.
А от як би ви їй спробували згодувати юнікодну строку, то у вас нічого не вийшло б. Бо на вінді строки кодуються в UTF-16, де усі символи кодуються двома байтами (насправді є іще сурогатні пари), і для англійських символів другий байт завжди нуль. Наприклад "w" - 0x77 0x00. Ансішна функція сприйме це як рядок з одного символа, бо нуль для неї - це ознака кінця рядка.

Подякували: #Sparta1