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

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

06.06.2014, 17:37. Показов 4900. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.06.2014, 17:37
Ответы с готовыми решениями:

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

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

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

40
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 18:26
Цитата Сообщение от 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  [ТС]
Там стоит 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
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 18:55
Цитата Сообщение от 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  [ТС]
С NORMAL_PRIORITY_CLASS ничего не изменилось.
а вот если поставить BELOW_NORMAL_PRIORITY_CLASS, то возвращается только код ошибки 6.
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 19:13
Сейчас специально проверил на похожей рабочей функции, дело не в 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
Просмотров: 127

Размер: 8.2 Кб

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

А вот про то, что функция возвращает результат своей работы, это хорошее замечание. Как-то сразу не подумал об этом, спасибо.
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 20:15
Цитата Сообщение от yar_resh Посмотреть сообщение
Я использую GetLastError() так как это пока что единственный известный мне способ узнать об ошибке
Единственный правильный способ узнать об ошибке - проанализировать код возврата функции. Если в описании указывается, что для дополнительной информации можно использовать GetLastError(), то оно используется. В данной функции GetLastError() как показатель ошибок использовать нельзя, так как это значение может быть установлено запускаемым процессом.
2
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
06.06.2014, 20:17
Цитата Сообщение от yar_resh Посмотреть сообщение
Я использую GetLastError() так как это пока что единственный известный мне способ узнать об ошибке.
это информация о последней ошибке
которая могла быть и внутри приложения
вообще вот её расшифровка
ERROR_INVALID_HANDLE
6 (0x6)
The handle is invalid.
вот и думай какая хандле у неё инвалид
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 20:20
Цитата Сообщение от ValeryS Посмотреть сообщение
это информация о последней ошибке
которая могла быть и внутри приложения
Вот и я о том же...
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
06.06.2014, 20:21
Цитата Сообщение от yar_resh Посмотреть сообщение
CloseHandle(pi.hThread);
попробуй выбросить эту строку
по логике процесс прибили то и поток прибъется
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 20:24
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй выбросить эту строку
по логике процесс прибили то и поток прибъется
Все там верно, ошибка явно создается запускаемым процессом. Суть в том, что в контексте функции CreateProcess() эту ошибку проверять не нужно.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
06.06.2014, 20:26
Цитата Сообщение от yar_resh Посмотреть сообщение
STARTUPINFO si;
* * PROCESS_INFORMATION pi;
попробуй еще это динамически выделить
может запускаемая программа использует стек запуск запускаемой и переполняет его
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 20:39
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй еще это динамически выделить
может запускаемая программа использует стек запуск запускаемой и переполняет его
Она бы тогда не запустилась.. Не?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
06.06.2014, 20:43
Цитата Сообщение от dmitry94 Посмотреть сообщение
Она бы тогда не запустилась.. Не?
а вот кто её знает
она же стек не сразу тратит
придет Убежденный и может расскажет
я так глубоко не копал, нужды не было
0
5 / 5 / 4
Регистрация: 01.06.2014
Сообщений: 55
06.06.2014, 20:43  [ТС]
Функция CreateProcess() возвращает ненулевое значение, что свидетельствует о её удачном вызове.
Спасибо за помощь
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
06.06.2014, 20:45
меня вот что смутило
Цитата Сообщение от yar_resh Посмотреть сообщение
Попробовал запустить батник и консольное приложение. GetLastError() возвращает 0.
Цитата Сообщение от yar_resh Посмотреть сообщение
Все приложения с графическим интерфейсом, которые я пробовал запустить, дают эту ошибку.
графика то больше памяти тратит
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 20:46
Цитата Сообщение от ValeryS Посмотреть сообщение
придет Убежденный и может расскажет
я так глубоко не копал, нужды не было
Да, я сам Убежденного боюсь, но свое imho все рано высказываю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.06.2014, 20:46
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru