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

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

06.06.2014, 17:37. Показов 4914. Ответов 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
06.06.2014, 20:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от dmitry94 Посмотреть сообщение
Да, я сам Убежденного боюсь,
А че его боятся
нормальный специалист, который очень хорошо знает внутренности винды
По крайней мере, лучше, чем я

Добавлено через 1 минуту
Цитата Сообщение от dmitry94 Посмотреть сообщение
но свое imho все рано высказываю
а это правильно
нет монополии на истину
главное не упорствовать в своих заблуждениях
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 21:22
Цитата Сообщение от ValeryS Посмотреть сообщение
По крайней мере, лучше, чем я
Чем мы все вместе взятые. Ну да ладно, речь не о том.
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.06.2014, 21:31
Return value

The return value is the calling thread's last-error code.

The Return Value section of the documentation for each function that sets the last-error code notes the conditions under which the function sets the last-error code. Most functions that set the thread's last-error code set it when they fail. However, some functions also set the last-error code when they succeed. If the function is not documented to set the last-error code, the value returned by this function is simply the most recent last-error code to have been set; some functions set the last-error code to 0 on success and others do not.
(c) MSDN

Какой смысл вообще проверять там GetLastError? Его нужно проверять, когда вызов зафейлился и только в этом случае.
1
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2014, 21:35
Цитата Сообщение от villu Посмотреть сообщение
Какой смысл вообще проверять там GetLastError? Его нужно проверять, когда вызов зафейлился и только в этом случае.
Эту истину мы открыли на прошлой странице
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.06.2014, 21:38
Уже почитал у меня сегодня руки быстрее головы...
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
06.06.2014, 21:54
villu,
теперь нас другой вопрос интересует
почему у консоли 0 а у графики 6???
и какую такую хандлю она ломает?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.06.2014, 21:55
наверно потому что оно не может ресурс для иконки открыть и рисует дефолт?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
06.06.2014, 21:57
Цитата Сообщение от villu Посмотреть сообщение
наверно потому что оно не может ресурс для иконки открыть
логично спросить, почему не может открыть?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.06.2014, 22:00
я к тому, что ошибка там может быть абсолютно где угодно. Не надо на нее смотреть. Выяснили же уже. на прошлой странице =D
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
06.06.2014, 22:26
Цитата Сообщение от villu Посмотреть сообщение
я к тому, что ошибка там может быть абсолютно где угодно. Не надо на нее смотреть.
в данном контексте не надо
а на будущее? Если прога рухнет( или не рухнет), как узнать где копать?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.06.2014, 22:30
Надо проверять какая функция вернула fail. Либо запустить под каким-нить AppVerifier и натравить дебагер. На невалидные хендлы он носом натыкает.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
06.06.2014, 22:36
Цитата Сообщение от villu Посмотреть сообщение
Надо проверять какая функция вернула fail. Либо запустить под каким-нить AppVerifier и натравить дебагер. На невалидные хендлы он носом натыкает.
как ты предлагаешь это сделать?
например я в своей проге запускаю какой нибудь Фотошоп и он рухает, мне его дебажить?
дело то не в фотошопе а в моей проге, то ли памяти недодал, то ли окружение кривое, то ли еще что нибудь, вот и пытаюсь понять
принципиальна эта ошибка или нет
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.06.2014, 22:57
"Рухнувший" фотошоп выходит за рамки этой проблемы. И GetLastError тебе тут точно не поможет.
GetLastError Ставится в контексте твоего потока и используется тогда, когда нужно. в твоем случае он либо не запустится совсем, либо упадет, но уже без тебя. GetLastError( ) показывает переменную твоего потока, которую кто-то там где-то раньше установил.

и Если тебе нужно знать кто, то нужно проверять результаты ВСЕХ функций, которые ты пользуешь (и которые это подразумевают). Иначе никак.

................
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
BOOL call_a( ) {  
....//do something
    if( err ) {
        SetLastError(4455);
        return FALSE;
    }
.......
}
 
void call_b(  ) {
.....
    if( !call_a( ) ) { // call_a НЕ критичен и не повод прерывать приложение
        write_error_to_syslog( GetLastError( ) );
        create_and_load_new_file( );
        
    } else {
        show_cool_message( );
        load_old_file( );
    }
.... // continue execution    
}
 
int main(  )   {
....
    call_b( );
    /// GetLastError( ) == 4455; только тут он абсолютно бессмысленен.
....
}
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
06.06.2014, 23:09
Цитата Сообщение от villu Посмотреть сообщение
GetLastError( ) показывает переменную твоего потока, которую кто-то там где-то раньше установил.
прекрасно
значит ошибка появилась в программе "обертке"?
или она пришла из запускаемой программы?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.06.2014, 23:15
ее установила какая-то _твоя_ функция. то есть в твоём процессе. От процесса, который ты запустил, ты можешь получить код завершения, например. Но это не тоже самое, что LastError

Например в коде у ТС SetLastError могли сделать
CreateProcess, WaitForSingleObject и CloseHandle. Но так как автор не проверил их результат, сказать кто сложно.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
06.06.2014, 23:18
Цитата Сообщение от villu Посмотреть сообщение
CreateProcess, WaitForSingleObject и CloseHandle. Но так как автор не проверил их результат, сказать кто сложно.
вопрос: почему с графикой установил, а с консолью нет?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.06.2014, 23:21
Так проверь какая функция из 3х вернула фейл. Если никакая, то значит внутренние системные разборки и разработчика запускалки уже не касаются.
1
5 / 5 / 4
Регистрация: 01.06.2014
Сообщений: 55
06.06.2014, 23:51  [ТС]
Цитата Сообщение от villu Посмотреть сообщение
Так проверь какая функция из 3х вернула фейл. Если никакая, то значит внутренние системные разборки и разработчика запускалки уже не касаются.
CreateProcess возвратила ненулевое значение -успех
WaitForSingleObject возвратила WAIT_OBJECT_0 - тоже успех
CloseHandle возвратила 1.
Ну вот и отличненько


Ещё раз спасибо всем выше отписавшимся. Не думал, что тут так быстро отвечают
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.06.2014, 09:53
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

Подытоживая все написанное выше...

Цитата Сообщение от yar_resh Посмотреть сообщение
после завершения работы функция GetLastError() возвращает код ошибки 6 (The handle is invalid) либо код ошибки 1813 (The specified resource type cannot be found in the image file).
Кто-нибудь может объяснить почему так и как это исправить?
GetLastError имеет смысл звать только в том случае, когда Win32-функция
завершилась с ошибкой. В других случаях, - если только это явно не
отмечено в документации, как, например, с AdjustTokenPrivileges, -
состояние last error не определено. Там может храниться что угодно, к
примеру код какой-нибудь прошлой ошибки, никак не связанный с
текущим состоянием. Другими словами, Win32-функции при успешном
завершении не устанавливают last error в 0.

И если уже проверять GetLastError, то делать это нужно сразу же
после того, как Win32-функция вернула ошибку. Часто приходится видеть
код примерно такого плана:
C++
1
2
3
4
5
6
7
8
9
10
11
HANDLE hFile = CreateFile(...);
 
if (hFile == INVALID_HANDLE_VALUE)
{
    VirtualFree(...); // Здесь last error, возможно, портится.
    CryptReleaseContext(...); // И здесь тоже.
    SomeFunction(); // И здесь...
 
    printf("CreateFile error, GLE = %lu.", GetLastError()); // А смысл ?
    return false;
}
Исправленный вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
HANDLE hFile = CreateFile(...);
 
if (hFile == INVALID_HANDLE_VALUE)
{
    DWORD const GLE = GetLastError();
 
    VirtualFree(...);
    CryptReleaseContext(...);
    SomeFunction();
 
    printf("CreateFile error, GLE = %lu.", GLE);
    return false;
}
И еще. Использовать или нет GetLastError в отношении какой-то
функции, какие там могу быть значения, устанавливается ли она в 0 в
случае успешного завершения и т.д. - ответы на все эти вопросы
следует искать в официальной документации, то есть, в MSDN, на
странице с описанием функции. И если там не сказано, что last error
принимает такое-то значение, значит, рассчитывать на это нельзя.

Цитата Сообщение от dmitry94 Посмотреть сообщение
В данной функции (CreateProcess) GetLastError()
как показатель ошибок использовать нельзя, так как это значение может
быть установлено запускаемым процессом.
Нет, такого быть не может.
Во-первых, в описании CreateProcess четко сказано:
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.
To get extended error information, call GetLastError.
Во-вторых, дочерний процесс никак не влияет на last error
потока, который его запустил.

Цитата Сообщение от dmitry94 Посмотреть сообщение
Единственный правильный способ узнать об ошибке - проанализировать код возврата функции. Если в описании указывается, что для дополнительной информации можно использовать GetLastError(), то оно используется.
Именно!

Собственно, вот: Ошибка при запуске приложения из приложения WinAPI
Правильный и исчерпывающий ответ на вопрос уже дан.

Цитата Сообщение от ValeryS Посмотреть сообщение
теперь нас другой вопрос интересует
почему у консоли 0 а у графики 6???
и какую такую хандлю она ломает?
"Фазы луны".
Запуск нового процесса - это "портянка" кода страниц так на пятьдесят.
Неудивительно, что состояние переменных потока, таких как last error,
может быть самым причудливым.

Цитата Сообщение от ValeryS Посмотреть сообщение
Если прога рухнет( или не рухнет), как узнать где копать?
GetExitCodeProcess.
"Правильные" процессы возвращают 0 в случае успешного завершения.
Last error здесь не помощник.
3
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.06.2014, 10:23
Убежденный,
Огромное спасибо!!!
Вот ведь как бывает все по отдельности вроде известно, а вместе связать не получается
но вот это как то мимо меня прошло
Цитата Сообщение от Убежденный Посмотреть сообщение
Другими словами, Win32-функции при успешном
завершении не устанавливают last error в 0.
нужды не было

Добавлено через 1 минуту

Не по теме:

Убежденный, отзыв почему то не могу оставить :cry:

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2014, 10:23
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru