Форум программистов, компьютерный форум CyberForum.ru

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 70, средняя оценка - 4.84
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
#1

Как пользоваться GetLastError() ? - C++ WinAPI

07.06.2013, 22:21. Просмотров 10577. Ответов 16
Метки нет (Все метки)

Хотел узнать, как пользоваться этой функцией? Где-то говорят вывести её на экран и посмотреть(не получается...), где-то - через Error Lookup. Но он требует какую-то переменную... Делал так: UINT error = GetLastError(); (на одном форуме нашёл) и вводил эту переменную в Error Lookup - ругается...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 22:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как пользоваться GetLastError() ? (C++ WinAPI):

Как сделать обработку ошибок? GetLastError возвращает ошибки 203, 299, 1400 - C++ WinAPI
Уже три дня бьюсь :wall: не где не могу найти как делать обработку ошибок и что делать если тебе возвращает не то что надо. GetLasssError...

Отлов ошибок. GetLastError() - C++ WinAPI
Отлов ошибок, ошибка регистрации окна, ошибка создания окна, ошибка создания дочернего окна. Может кому пригодится.. #include...

Самомодификация. GetLastError() = 299 - C++ WinAPI
Решил потренироваться и изучить самомодификацию. Написал код: int _tmain(int argc, _TCHAR* argv) { unsigned char* AddressFunc =...

LineTo / Polyline ошибка, GetLastError() == 0 - C++ WinAPI
Здравствуйте. Проблема следующая: Приложение для отрисовки графики использует WinAPI, в частности, для построения линии использую ф-и...

GetLastError() ошибка 127 не могу понять почему не вызывает? - C++ WinAPI
dll #include <vcl.h> #include <windows.h> #include <fstream> #pragma hdrstop #pragma argsused int WINAPI...

Как пользоваться EnumUILanguages() - C++ WinAPI
Как мне узнать список всех языков Как пользоваться этими функциями : EnumUILanguages(), EnumSystemLocales()

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Игорь с++
434 / 457 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
07.06.2013, 22:30 #2
После использование WinAPI -шной функции если она закончилась не удачей пиши -
C++
1
int Error = GetLastError();
затем смотри номер ошибки и лезь в MSDN и ищи свой номер.
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
07.06.2013, 23:33  [ТС] #3
Цитата Сообщение от Игорь с++ Посмотреть сообщение
смотри номер ошибки
А где на него смотреть?
Игорь с++
434 / 457 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
07.06.2013, 23:39 #4
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
07.06.2013, 23:47  [ТС] #5
Вы меня не так поняли). Я хотел спросить не где расшифровать номер ошибки, а как мне его увидеть.
Ну т.е поставил я после кода в котором ошибка int Error = GetLastError(); а дальше что?
Игорь с++
434 / 457 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
07.06.2013, 23:49 #6
Цитата Сообщение от kciosdse Посмотреть сообщение
Ну т.е поставил я после кода в котором ошибка int Error = GetLastError(); а дальше что?
C++
1
cout<<Error;
это ?
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
07.06.2013, 23:52  [ТС] #7
Вообщем да, но приложение не консольное.
Игорь с++
434 / 457 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
07.06.2013, 23:59 #8
смотри пример - допустим мы используем для запуска файла - ShellExecuteA , и специально пропишим не существующий путь .
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstdlib>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    
    int Error = 0;
    
ShellExecuteA(NULL,NULL,"C:\\AbraKadabra.exe",NULL,NULL,SW_SHOWNORMAL);
 
Error = GetLastError();
 
cout<<"Number Error = "<<Error<<"\n";
    
    // Номер ошибки = 2 - Не удается найти указанный файл.
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 3 минуты
Цитата Сообщение от kciosdse Посмотреть сообщение
Вообщем да, но приложение не консольное.
Да а разница то , тогда так -
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
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        static int Error = 0;
        static char Number[20];       
 
    switch (message)                  /* handle the messages */
    {
           
           case WM_CREATE:
                
 ShellExecuteA(NULL,NULL,"C:\\AbraKadabra.exe",NULL,NULL,SW_SHOWNORMAL);
 
Error = GetLastError();
 
itoa(Error,Number,10);
 
MessageBoxA(hwnd,Number,"Info",MB_OK);
                
                break;
           
           
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
08.06.2013, 00:19  [ТС] #9
Ясно, спасибо большое!
Убежденный
Системный программист
Эксперт С++
15516 / 7014 / 1109
Регистрация: 02.05.2013
Сообщений: 11,452
Завершенные тесты: 1
08.06.2013, 11:44 #10
Маленькая поправочка, исключительно для точности.
GetLastError возвращает значение типа DWORD (unsigned long), а не int.
Whatson2
7 / 7 / 0
Регистрация: 06.09.2014
Сообщений: 40
Завершенные тесты: 2
05.11.2014, 21:24 #11
Подскажите, пожалуйста!
Как мне обработать результат GetLastError() "удалённо от места, но в коде"? В примере из
MSDN показано как это работает для одного потока. Плюс, могут встретиться функции в коде, которые повторно и успешно вызывают GetLastError(). До сих пор я использовал простенькую
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void TLogManager::LastError(const WideString FILE,  const WideString FNC = "", const int LINE = 0) const
{
    DWORD dw = GetLastError();
    void* cstr;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),                              // Default language
        (LPTSTR) &cstr,
        0,
        NULL
        );
    WideString res((char*)cstr);
    LocalFree(cstr);
    wchar_t buff[255];
    ShowMessage(L"(" + FILE + L" / " + FNC + L" / Line: " + IntToStr(LINE - 1) + L"): " + res.c_bstr());
}
функцию, но столкнулся с 2-мя вышеописанными проблемами. А очень хочется...
P.S.:
Я наметил 2 подхода:
1) использовать свой класс Exception и кидать исключения, но с потоками проблема останется, т.к. стеки разные. Можно копать дальше и решить эту проблему: я где-то видел, как ставился хук на (kernel32) UnhandledExceptionFilter при помощи библитечки Detuors и подменяется адресс раскрутки...
2) изучить и использовать один из логгеров Pantheios/google-glog/Boost.Log/log4cpp...
В конце-концов хочется очень малого: получить значения некоторых переменных на момент краха программы, а лучше воссоздать ситуацию краха "в лабораторных условиях".
Убежденный
Системный программист
Эксперт С++
15516 / 7014 / 1109
Регистрация: 02.05.2013
Сообщений: 11,452
Завершенные тесты: 1
05.11.2014, 22:41 #12
Цитата Сообщение от Whatson2 Посмотреть сообщение
В конце-концов хочется очень малого: получить значения некоторых переменных на момент краха программы, а лучше воссоздать ситуацию краха "в лабораторных условиях".
SetUnhandledExceptionFilter + MiniDumpWriteDump.
Первая функция устанавливает обработчик исключений, вторая
пишет крэш-дамп на диск. Такой дамп потом, имея pdb-символы,
можно открыть в отладчике и подробно разобрать.

Еще одна вариация, несколько более сложная, но и эффективная -
Vectored Exceptions, здесь обработчик будет вызываться до SEH и
это в некоторых ситуациях предпочтительнее.

На RSDN недели две-три назад один человек выкладывал код с
VEH и сбором крэш-дампов, ссылку не могу дать, к сожалению
(запрещено правилами форума).

Добавлено через 51 секунду
Цитата Сообщение от Whatson2 Посмотреть сообщение
изучить и использовать один из логгеров Pantheios/google-glog/Boost.Log/log4cpp.
Насмотрелся я этих логгеров вдоль и поперек, в итоге пришел к
выводу, что ничего лучше OutputDebugString/WPP Tracing в
природе не существует.
Whatson2
7 / 7 / 0
Регистрация: 06.09.2014
Сообщений: 40
Завершенные тесты: 2
05.11.2014, 23:32 #13
Спасибо!
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 797
Записей в блоге: 10
16.12.2014, 13:31 #14
Пусть поздновато ,но

Но в msdn есть классный ,пример на всякий случай

Retrieving the Last-Error Code

Возвращает текстовое описание ошибки в MessageBox-е
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 22
Завершенные тесты: 1
19.09.2016, 12:15 #15
Всем привет, столкнулся с такой интересной проблемой, отлаживаю программу в режиме Debug с точками останова. В программе выполняется функция Createfile , в режиме Release после выполнения функции если выполнить GetLastError, то выводит ошибку 3(к примеру), переключаю в режим Debug Getlasterror дает 0. Хотя функция Createfile также не выполнилась как и в Relelase. как мне в отладчике ловить эту ошибку, мне она нужна для вызова другой функции в случае ошибки, хочу эту функцию отладить... почему в отладке GetlastError не работает?

Добавлено через 5 минут
Всё, разобрался, видимо в режиме Debug GetlastError работает в более широком варианте, между Createfile и Getlasterror выделял динамически память под переменную для ошибки, если выделить статически, то работает, не знаю почему
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2016, 12:15
Привет! Вот еще темы с ответами:

Как пользоваться функцией GetTokenInformation? - C++ WinAPI
Синтаксис функции следующий: Более подробно: https://msdn.microsoft.com/en-us/library/aa446671(VS.85).aspx Меня интересует, как...

Объясните как пользоваться WriteProcessMemory() - C++ WinAPI
Привет всем обитателям этого форума=) Объясните пожалуйста как пользоваться WriteProcessMemory(). То что нужно сначала найти процесс,...

Как пользоваться функцией GetSystemFileCacheSize? - C++ WinAPI
http://msdn.microsoft.com/en-us/library/aa965224.aspx покажите пожалуйста на примере как пользоваться этой функцией. Добавлено...

OpenEventLog возвращает 0, GetLastError возвращает 1314 (Недостаточно прав) - C++ WinAPI
Добрый день! В программе используется OpenEventLog, она возвращает нулевой дескриптор, вызванная поле нее функция GetLastError возвращает...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.09.2016, 12:15
Ответ Создать тему
Опции темы

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