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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 70, средняя оценка - 4.84
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
07.06.2013, 22:21     Как пользоваться GetLastError() ? #1
Хотел узнать, как пользоваться этой функцией? Где-то говорят вывести её на экран и посмотреть(не получается...), где-то - через Error Lookup. Но он требует какую-то переменную... Делал так: UINT error = GetLastError(); (на одном форуме нашёл) и вводил эту переменную в Error Lookup - ругается...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
07.06.2013, 22:30     Как пользоваться GetLastError() ? #2
После использование WinAPI -шной функции если она закончилась не удачей пиши -
C++
1
int Error = GetLastError();
затем смотри номер ошибки и лезь в MSDN и ищи свой номер.
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
07.06.2013, 23:33  [ТС]     Как пользоваться GetLastError() ? #3
Цитата Сообщение от Игорь с++ Посмотреть сообщение
смотри номер ошибки
А где на него смотреть?
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
07.06.2013, 23:39     Как пользоваться GetLastError() ? #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  [ТС]     Как пользоваться GetLastError() ? #5
Вы меня не так поняли). Я хотел спросить не где расшифровать номер ошибки, а как мне его увидеть.
Ну т.е поставил я после кода в котором ошибка int Error = GetLastError(); а дальше что?
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
07.06.2013, 23:49     Как пользоваться GetLastError() ? #6
Цитата Сообщение от kciosdse Посмотреть сообщение
Ну т.е поставил я после кода в котором ошибка int Error = GetLastError(); а дальше что?
C++
1
cout<<Error;
это ?
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
07.06.2013, 23:52  [ТС]     Как пользоваться GetLastError() ? #7
Вообщем да, но приложение не консольное.
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
07.06.2013, 23:59     Как пользоваться GetLastError() ? #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  [ТС]     Как пользоваться GetLastError() ? #9
Ясно, спасибо большое!
Убежденный
Системный программист
 Аватар для Убежденный
14438 / 6422 / 1015
Регистрация: 02.05.2013
Сообщений: 10,664
Завершенные тесты: 1
08.06.2013, 11:44     Как пользоваться GetLastError() ? #10
Маленькая поправочка, исключительно для точности.
GetLastError возвращает значение типа DWORD (unsigned long), а не int.
Whatson2
 Аватар для Whatson2
7 / 7 / 0
Регистрация: 06.09.2014
Сообщений: 37
Завершенные тесты: 1
05.11.2014, 21:24     Как пользоваться GetLastError() ? #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...
В конце-концов хочется очень малого: получить значения некоторых переменных на момент краха программы, а лучше воссоздать ситуацию краха "в лабораторных условиях".
Убежденный
Системный программист
 Аватар для Убежденный
14438 / 6422 / 1015
Регистрация: 02.05.2013
Сообщений: 10,664
Завершенные тесты: 1
05.11.2014, 22:41     Как пользоваться GetLastError() ? #12
Цитата Сообщение от Whatson2 Посмотреть сообщение
В конце-концов хочется очень малого: получить значения некоторых переменных на момент краха программы, а лучше воссоздать ситуацию краха "в лабораторных условиях".
SetUnhandledExceptionFilter + MiniDumpWriteDump.
Первая функция устанавливает обработчик исключений, вторая
пишет крэш-дамп на диск. Такой дамп потом, имея pdb-символы,
можно открыть в отладчике и подробно разобрать.

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

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

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

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

Retrieving the Last-Error Code

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

Добавлено через 5 минут
Всё, разобрался, видимо в режиме Debug GetlastError работает в более широком варианте, между Createfile и Getlasterror выделял динамически память под переменную для ошибки, если выделить статически, то работает, не знаю почему
Убежденный
Системный программист
 Аватар для Убежденный
14438 / 6422 / 1015
Регистрация: 02.05.2013
Сообщений: 10,664
Завершенные тесты: 1
19.09.2016, 12:29     Как пользоваться GetLastError() ? #16
Цитата Сообщение от Артем2289 Посмотреть сообщение
между Createfile и Getlasterror выделял динамически память под переменную для ошибки, если выделить статически, то работает, не знаю почему
Ну потому что выделение памяти затрагивает какую-нибудь системную функцию,
например VirtualAlloc, а она меняет last error. Вот почему GetLastError нужно звать
сразу же. Т.е. между CreateFile и GetLastError не должно быть ничего.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 18:22     Как пользоваться GetLastError() ?
Еще ссылки по теме:

C++ WinAPI GetRegionData() всегда возвращает ноль. Не пойму, как пользоваться
GetLastError() ошибка 127 не могу понять почему не вызывает? C++ WinAPI
C++ WinAPI Как сделать обработку ошибок? GetLastError возвращает ошибки 203, 299, 1400
C++ WinAPI OpenEventLog возвращает 0, GetLastError возвращает 1314 (Недостаточно прав)
C++ WinAPI Как пользоваться функцией GetTokenInformation?

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

Или воспользуйтесь поиском по форуму:
Yksus01
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 47
11.01.2017, 18:22     Как пользоваться GetLastError() ? #17
А если выдает ошибку
ERROR_RESOURCE_TYPE_NOT_FOUND

на:

HINSTANCE hInstance = GetModuleHandle(NULL);

chat_wnd_class.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

- как понять неверный тип ?
Yandex
Объявления
11.01.2017, 18:22     Как пользоваться GetLastError() ?
Ответ Создать тему
Опции темы

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