Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
5 / 5 / 4
Регистрация: 01.06.2014
Сообщений: 55
1

Ошибка при запуске приложения из приложения WinAPI

06.06.2014, 17:37. Просмотров 3338. Ответов 40
Метки нет (Все метки)


Здравствуйте.

Есть следующий код, найденный на просторах интернета.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(int argc, char **argv)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    TCHAR szCmdLine[] = _T("\"F:\\Downloads\\NCHTONER.EXE\" -L");
    CreateProcess(NULL, szCmdLine, NULL, NULL,
        FALSE, 0, NULL, NULL, &si, &pi);
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
 
    cout << GetLastError() << endl;
    cout << "Press any key" << endl;
    cin.get();
 
    return EXIT_SUCCESS;
}
Приложение, лежащее по пути "F:\Downloads\NCHTONER.EXE", успешно запускается, но после завершения работы функция GetLastError() возвращает код ошибки 6 (The handle is invalid) либо код ошибки 1813 (The specified resource type cannot be found in the image file).
Кто-нибудь может объяснить почему так и как это исправить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2014, 17:37
Ответы с готовыми решениями:

Ошибка при запуске Release-сборки приложения
Здравствуйте! напишите пожалуйста подробный гайд, как делать рабочее exe сразу после компиляции? ...

Ошибка при запуске приложения 0x0000007b
Доброго! Имею проект в VS2012, билд на других компах при запуске выдает ошибку 0x0000007b. dll...

Вывод сообщения на экран при запуске оконного приложения
Необходимо сделать через хуки. Пыталась сделать с SetWindowsHookEx. Толка 0. Помоги пожалуйста....

Пример WinAPI приложения
Можете привести код самого простого оконного приложения на C++ + winapi (кроме HelloWorld), а то не...

40
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
06.06.2014, 18:26 2
Цитата Сообщение от yar_resh Посмотреть сообщение
CreateProcess(NULL, szCmdLine, NULL, NULL,
* * * * FALSE, 0, NULL, NULL, &si, &pi);
А почему dwCreationFlags [in] у вас 0. В описании этих флагов на http://msdn.microsoft.com/en-u... s.85).aspx такого значения я не вижу. Возможно причина в этом. Что при других флагах?
0
5 / 5 / 4
Регистрация: 01.06.2014
Сообщений: 55
06.06.2014, 18:43  [ТС] 3
Там стоит 0, потому что в примере, откуда я брал этот код стоял 0.
Вот сдесь прочитал такие строки:
If none of the priority class flags is specified, the priority class defaults to NORMAL_PRIORITY_CLASS unless the priority class of the creating process is IDLE_PRIORITY_CLASS or BELOW_NORMAL_PRIORITY_CLASS
Правильно ли я понял, что если оставить 0, то по умолчанию присвоится NORMAL_PRIORITY_CLASS?

Добавлено через 4 минуты
Заметил такую закономерность. Если поработать с открытым приложением, то после закрытия возвращается код ошибки 6. Если же с приложением ничего не делать, а просто закрыть его, то возвращается код 1813.
0
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
06.06.2014, 18:55 4
Цитата Сообщение от yar_resh Посмотреть сообщение
Правильно ли я понял, что если оставить 0, то по умолчанию присвоится NORMAL_PRIORITY_CLASS?
Я не знаю. У меня такой информации нет. Я просто вижу, что в описании этих флагов значение 0 отсутствует. Попробуйте задать один из перечисленных флагов и посмотрите, повторяется ли ошибка.

Добавлено через 6 минут
Цитата Сообщение от yar_resh Посмотреть сообщение
Вот сдесь прочитал такие строки:
И где там говорится о 0 в качестве параметра dwCreationFlags?
0
5 / 5 / 4
Регистрация: 01.06.2014
Сообщений: 55
06.06.2014, 18:56  [ТС] 5
С NORMAL_PRIORITY_CLASS ничего не изменилось.
а вот если поставить BELOW_NORMAL_PRIORITY_CLASS, то возвращается только код ошибки 6.
0
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
06.06.2014, 19:13 6
Сейчас специально проверил на похожей рабочей функции, дело не в 0.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int start_extract_process(const wchar_t *extract_cmd)
{
    int result;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
 
    SetCursor(g_cur_wait);
 
 
    //CREATE_NO_WINDOW
 
    result = CreateProcess(NULL,(wchar_t *)extract_cmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
    WaitForSingleObject( pi.hProcess, INFINITE );
    ULONG ret;
    GetExitCodeProcess(pi.hProcess, &ret);  // код завершения
 
    if (ret != 0) result = 0;
 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
 
    SetCursor(g_cur_normal);
 
    if (result == 0) print_extract_error(extract_cmd,ret);
 
    wchar_t gle[20];
    wsprintf(gle,L"GetLastError()=%d",GetLastError());
    MessageBox(NULL,gle,NULL,0);
 
    return result;
}
Название: ee.jpg
Просмотров: 123

Размер: 8.2 Кб

Другую программу пробовал запускать, тоже самое?
0
5 / 5 / 4
Регистрация: 01.06.2014
Сообщений: 55
06.06.2014, 19:40  [ТС] 7
Попробовал запустить батник и консольное приложение. GetLastError() возвращает 0.
А вот в приложениях с графическим интерфейсом GetLastError() возвращает указанные выше ошибки.
0
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
06.06.2014, 19:55 8
Есть такой вариант, что эту ошибку создает само запущенное приложение и с ним нужно разбираться. А вообще зачем вам GetLastError() по выходе, что оно дает? Для оценки результата работы функции есть другие параметры, она возвращает результат своей работы.
1
5 / 5 / 4
Регистрация: 01.06.2014
Сообщений: 55
06.06.2014, 20:03  [ТС] 9
Все приложения с графическим интерфейсом, которые я пробовал запустить, дают эту ошибку.
Я использую GetLastError() так как это пока что единственный известный мне способ узнать об ошибке. Да и если ошибка есть, то было бы неплохо разобраться почему она возникает.

А вот про то, что функция возвращает результат своей работы, это хорошее замечание. Как-то сразу не подумал об этом, спасибо.
0
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
06.06.2014, 20:15 10
Цитата Сообщение от yar_resh Посмотреть сообщение
Я использую GetLastError() так как это пока что единственный известный мне способ узнать об ошибке
Единственный правильный способ узнать об ошибке - проанализировать код возврата функции. Если в описании указывается, что для дополнительной информации можно использовать GetLastError(), то оно используется. В данной функции GetLastError() как показатель ошибок использовать нельзя, так как это значение может быть установлено запускаемым процессом.
2
Модератор
Эксперт по электронике
8357 / 6203 / 834
Регистрация: 14.02.2011
Сообщений: 21,561
06.06.2014, 20:17 11
Цитата Сообщение от yar_resh Посмотреть сообщение
Я использую GetLastError() так как это пока что единственный известный мне способ узнать об ошибке.
это информация о последней ошибке
которая могла быть и внутри приложения
вообще вот её расшифровка
ERROR_INVALID_HANDLE
6 (0x6)
The handle is invalid.
вот и думай какая хандле у неё инвалид
0
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
06.06.2014, 20:20 12
Цитата Сообщение от ValeryS Посмотреть сообщение
это информация о последней ошибке
которая могла быть и внутри приложения
Вот и я о том же...
0
Модератор
Эксперт по электронике
8357 / 6203 / 834
Регистрация: 14.02.2011
Сообщений: 21,561
06.06.2014, 20:21 13
Цитата Сообщение от yar_resh Посмотреть сообщение
CloseHandle(pi.hThread);
попробуй выбросить эту строку
по логике процесс прибили то и поток прибъется
0
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
06.06.2014, 20:24 14
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй выбросить эту строку
по логике процесс прибили то и поток прибъется
Все там верно, ошибка явно создается запускаемым процессом. Суть в том, что в контексте функции CreateProcess() эту ошибку проверять не нужно.
0
Модератор
Эксперт по электронике
8357 / 6203 / 834
Регистрация: 14.02.2011
Сообщений: 21,561
06.06.2014, 20:26 15
Цитата Сообщение от yar_resh Посмотреть сообщение
STARTUPINFO si;
* * PROCESS_INFORMATION pi;
попробуй еще это динамически выделить
может запускаемая программа использует стек запуск запускаемой и переполняет его
0
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
06.06.2014, 20:39 16
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй еще это динамически выделить
может запускаемая программа использует стек запуск запускаемой и переполняет его
Она бы тогда не запустилась.. Не?
0
Модератор
Эксперт по электронике
8357 / 6203 / 834
Регистрация: 14.02.2011
Сообщений: 21,561
06.06.2014, 20:43 17
Цитата Сообщение от dmitry94 Посмотреть сообщение
Она бы тогда не запустилась.. Не?
а вот кто её знает
она же стек не сразу тратит
придет Убежденный и может расскажет
я так глубоко не копал, нужды не было
0
5 / 5 / 4
Регистрация: 01.06.2014
Сообщений: 55
06.06.2014, 20:43  [ТС] 18
Функция CreateProcess() возвращает ненулевое значение, что свидетельствует о её удачном вызове.
Спасибо за помощь
0
Модератор
Эксперт по электронике
8357 / 6203 / 834
Регистрация: 14.02.2011
Сообщений: 21,561
06.06.2014, 20:45 19
меня вот что смутило
Цитата Сообщение от yar_resh Посмотреть сообщение
Попробовал запустить батник и консольное приложение. GetLastError() возвращает 0.
Цитата Сообщение от yar_resh Посмотреть сообщение
Все приложения с графическим интерфейсом, которые я пробовал запустить, дают эту ошибку.
графика то больше памяти тратит
0
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
06.06.2014, 20:46 20
Цитата Сообщение от ValeryS Посмотреть сообщение
придет Убежденный и может расскажет
я так глубоко не копал, нужды не было
Да, я сам Убежденного боюсь, но свое imho все рано высказываю
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2014, 20:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

C++ и WinAPI - пример простого приложения
Можете дать пример простого приложения, которое будет выводить текст в окне Windows (не консоль). ...

Уменьшить размер приложения си winapi
Предлогаю к обсуждению тему по уменьшению размера приложений написаных на си WinApi.

Ошибка линковщика при создании приложения Win32
Подскажите пожалуйста, данный код судя по книге должен работать в Win32 но не могу понеять где...

Возможно ли создание такого приложения с использованием WinAPI?
Стоит задача создать приложение, в котором создаётся новый вектор обработки прерывания, которое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.