Delphi getlasterror текст ошибки

I have a problem using a third-party component in Delphi 2006 (also Delphi 7), in which I get an «Unspecified Error» when executing a function call to that component. Do you have example code that utilises GetLastError and FormatMessage in Delphi, that would allow me to access more information about the error ? TIA :)

asked Mar 21, 2009 at 10:10

Drew Gibson's user avatar

3

There is an integrated helper function in Delphi: SysErrorMessage. It’s essentially a wrapper to FormatMessage, but much simpler to use in your case. Just provide the error code you need a textual description for.

For example you can use this to display the last error:

ShowMessage(SysErrorMessage(GetLastError))

If you want to raise an exception with this message, it’s even simpler:

RaiseLastOSError;

Important: Make sure that there is no additional API call between the failing function and your call of GetLastError, otherwise the last error will be reset.

Grim's user avatar

Grim

2,7429 gold badges56 silver badges119 bronze badges

answered Mar 21, 2009 at 10:31

Daniel Rikowski's user avatar

Daniel RikowskiDaniel Rikowski

71k57 gold badges250 silver badges325 bronze badges

1

While DR is correct, there is a problem with this approach: It does not allow you to specify the context in which the error occurred. Ever seen the error «An API function failed.» whithout being any wiser which function it was and where it happended?

That’s why I wrote the RaiseLastOsErrorEx and Win32CheckEx functions:

procedure RaiseLastOsErrorEx(const _Format: string);
begin
  RaiseLastOsErrorEx(GetLastError, _Format);
end;

procedure RaiseLastOsErrorEx(_ErrorCode: integer; _Format: string); overload;
var
  Error: EOSError;
begin
  if _ErrorCode <> ERROR_SUCCESS then
    Error := EOSError.CreateFmt(_Format, [_ErrorCode, SysErrorMessage(_ErrorCode)])
  else
    Error := EOsError.CreateFmt(_Format, [_ErrorCode, _('unknown OS error')]);
  Error.ErrorCode := _ErrorCode;
  raise Error;
end;

function GetLastOsError(out _Error: string; const _Format: string = ''): DWORD;
begin
  Result := GetLastOsError(GetLastError, _Error, _Format);
end;

function GetLastOsError(_ErrCode: integer; out _Error: string; const _Format: string = ''): DWORD;
var
  s: string;
begin
  Result := _ErrCode;
  if Result <> ERROR_SUCCESS then
    s := SysErrorMessage(Result)
  else
    s := _('unknown OS error');
  if _Format <> '' then
    try
      _Error := Format(_Format, [Result, s])
    except
      _Error := s;
    end else
    _Error := s;
end;

function Win32CheckEx(_RetVal: BOOL; out _ErrorCode: DWORD; out _Error: string;
  const _Format: string = ''): BOOL;
begin
  Result := _RetVal;
  if not Result then
    _ErrorCode := GetLastOsError(_Error, _Format);
end;

(They are part of unit u_dzMiscUtils of my dzLib library available here:
https://osdn.net/projects/dzlib-tools/svn/view/dzlib/trunk/src/u_dzMiscUtils.pas?view=markup&root=dzlib-tools#l313

answered Jul 13, 2009 at 7:30

dummzeuch's user avatar

dummzeuchdummzeuch

10.8k4 gold badges51 silver badges156 bronze badges

4

Функция RTL SysErrorMessage(GetLastError).

Code:

procedure TForm1.Button1Click(Sender: TObject);

begin

{Cause a Windows system error message to be logged}

ShowMessage(IntToStr(lStrLen(nil)));

ShowMessage(SysErrorMessage(GetLastError));

end;

Подробности
Родительская категория: Windows
Категория: Программирование без VCL, работа с WinAPI

Добавить комментарий

CodeNet / Языки программирования / Delphi & Kylix / FAQ — Часто задаваемые вопросы / Borland Delphi VCL FAQ

Вопрос:

Как получить строку сообщения об ошибке Windows код которой получен функцией GetLastError?

Ответ:

Функция RTL SysErrorMessage(GetLastError).

Пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
  {Cause a Windows system error message to be logged}
  ShowMessage(IntToStr(lStrLen(nil)));
  ShowMessage(SysErrorMessage(GetLastError));
end;

[ Назад ]
[ Оглавление ]
[ Далее ]

Оставить комментарий

Комментарий:

можно использовать BB-коды

Максимальная длина комментария — 4000 символов.

CodeNet

ВКонтакте

Facebook

Twitter

Google

Яндекс

 


Форум программистов Vingrad

Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> [Delphi] Как вставить текст ошибки из окна IDE на форум, Подсказки 

:(

   

Опции темы

Akella
  Дата 26.11.2008, 00:18 (ссылка)
|    (голосов:1)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 3
Всего: 329

Некоторые пользователи форума не совсем удобно показывают тексты своих ошибок при выполнении программ.
Подсказка №1.
Если во время выполнения программы в среде программирования вываливается ошибка, то делаешь окно активным и нажимаешь на клавиатуре сочетание клавиш CTRL+C. Текст об ошибке из окна IDE копируется в буфер обмена. Потом вставляй на форум (CTRL+V). 

Подсказка №2.
Картинку можно закачать на сервер http://shot.qip.ru/

и получить вот так:
user posted image

ссылку на превью:
user posted image

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

Если картинка небольшая, то можно вставлять без предварительного просмотра, используя кнопку «Рисунок» слева от окна ввода сообщения, просто вставляешь ссылку на рисунок.  smile

Также есть замечательная программа shot.qip.ru, которая по сочетанию клавиш [Ctrl+]Print Screen поможет создать снимок экрана/окна, выделить что-либо на снимке или нарисовать. Программа очень удобная.

Это сообщение отредактировал(а) Akella — 9.4.2013, 23:28

PM MAIL   Вверх
Akella
Дата 12.12.2008, 14:21 (ссылка)
|    (голосов:1)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 3
Всего: 329

И вот ещё, Ctrl+C работает не только в случае ошибки. 
Вот исходный код программы:

Код

  sql:='select first 1 r.id ' +
    'from treklama r ' +
    'where (r.id2 = 0) ' +
    '  and (r.sort_napr = ' + IntToStr(snapr) + ') ' +
    '  and (r.sort_type = ' + IntToStr(stype) + ') ' +
    '  and (r.sort_razdel = ' + IntToStr(srazd) + ') ' +
    '  and (r.sort_rubrika = ' + IntToStr(srub) + ') ' +
    '  and (r.sort_region = ' + IntToStr(sreg) + ') ' +
    '  and (r.sort_vid = ' + IntToStr(svid) + ') ' +
    '  and (r.id_agency = ' + IntToStr(Id_Agency) + ') ' +
    '  and (r.REC_TO_EXPORT = 1) '+
    ' order by  r.sort_napr,  r.sort_type,  r.sort_razdel,  r.sort_rubrika,  r.sort_region,  r.sort_vid, r.id_agency';

   ShowMessage(sql);//во время исполнения кода будет показано окно с текстом, чтобы не делать снимок экрана, можно просто нажать Ctrl+C

благодаря    ShowMessage(sql)  во время исполнения кода будет показано окно с текстом, чтобы не делать снимок экрана, можно просто нажать в окне Ctrl+C

и получим в буфере обмена текст из окна с сообщением

Цитата
—————————
Заголовок окна
—————————
select first 1 r.id from treklama r where (r.id2 = 0)   and (r.sort_napr = 1)   and (r.sort_type = 1)   and (r.sort_razdel = 1)   and (r.sort_rubrika = 1)   and (r.sort_region = 1)   and (r.sort_vid = 1)   and (r.id_agency = 4)   and (r.REC_TO_EXPORT = 1)  order by  r.sort_napr,  r.sort_type,  r.sort_razdel,  r.sort_rubrika,  r.sort_region,  r.sort_vid, r.id_agency
—————————
OK   
—————————

это работает в любюй виндовой программе, а не только в дельфи

Это сообщение отредактировал(а) Akella — 22.2.2012, 13:47

PM MAIL   Вверх
Akella
Дата 18.12.2008, 18:01 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 3
Всего: 329

Как я понял, то в диалоговых окнах с сообщениями при запущенной программе НЕ из под IDE можно тоже нажать Ctrl+C и получить в буфере текст из окна сообщения. smile 

PM MAIL   Вверх
Akella
Дата 19.12.2008, 10:27 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 3
Всего: 329

Расшифровка кода ошибки GetLastError
Как получить строку сообщения об ошибке Windows, числовой код которой получен функцией GetLastError?

С помощью SysErrorMessage(GetLastError)

Код

Procedure TForm1.Button1Click(SEnder: TObject);
Begin
//какие-нибудь операции, например, копирование файла

//а теперь проверка, что возвращает GetLastError
if GetLastError > 0 then
  ShowMessage(SysErrorMessage(GetLastError));//показываем текст ошибки
End; 

Это сообщение отредактировал(а) Akella — 19.8.2010, 12:32

PM MAIL   Вверх
ProgramerForever
  Дата 26.5.2011, 08:40 (ссылка)
|    (голосов:1)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: нет
Всего: 5

Добавлю свои 5 копеек:
Чтобы не «резать» картинку, выделяя нужное окно из скриншота, удобно делать скриншот не всего экрана, а только активного окна. Это делается с помощью сочетания <Alt> + <PrtScr>

PM MAIL WWW ICQ   Вверх
Akella
Дата 26.5.2011, 09:16 (ссылка)
|    (голосов:2)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 3
Всего: 329

это нужно писать на форуме блондинок, а не на форуме ПРОГРАММИСТОВ!

PM MAIL   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Центр помощи»

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!

  • Название темы должно отражать её суть! (Не следует добавлять туда слова «помогите», «срочно» и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например «школьная задача», «задача из учебника» и т.п.), не нужно указывать ее сложность («простая задача», «легкий вопрос» и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку «Код»). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик — один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой «Пометить как решённый», которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »

Понравилась статья? Поделить с друзьями:
  • Delphi 7 ошибка при установке
  • Delphi 7 unable to rename delphi32 ошибка
  • Delonghi гриль ошибка op err
  • Delonghi magnifica ошибка очистки
  • Delonghi magnifica ошибка контейнера