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
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
2,7429 gold badges56 silver badges119 bronze badges
answered Mar 21, 2009 at 10:31
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
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 ВКонтакте Яндекс |
|
Форум программистов Vingrad
Модераторы: Poseidon |
Поиск: |
|
[Delphi] Как вставить текст ошибки из окна IDE на форум, Подсказки |
Опции темы |
Akella |
|
||
Творец Профиль
Репутация: 3
|
Некоторые пользователи форума не совсем удобно показывают тексты своих ошибок при выполнении программ. Подсказка №2. и получить вот так: ссылку на превью: теперь и нагрузка небольшая при загрузке страничек форума, и кому нужно может глянуть полный размер, щёлкнув по предварительному просмотру левой кнопкой мышки. Если картинка небольшая, то можно вставлять без предварительного просмотра, используя кнопку «Рисунок» слева от окна ввода сообщения, просто вставляешь ссылку на рисунок. Также есть замечательная программа shot.qip.ru, которая по сочетанию клавиш [Ctrl+]Print Screen поможет создать снимок экрана/окна, выделить что-либо на снимке или нарисовать. Программа очень удобная. Это сообщение отредактировал(а) Akella — 9.4.2013, 23:28 |
||
|
|||
Akella |
|
||||
Творец Профиль
Репутация: 3
|
И вот ещё, Ctrl+C работает не только в случае ошибки.
благодаря ShowMessage(sql) во время исполнения кода будет показано окно с текстом, чтобы не делать снимок экрана, можно просто нажать в окне Ctrl+C и получим в буфере обмена текст из окна с сообщением
это работает в любюй виндовой программе, а не только в дельфи Это сообщение отредактировал(а) Akella — 22.2.2012, 13:47 |
||||
|
|||||
Akella |
|
||
Творец Профиль
Репутация: 3
|
Как я понял, то в диалоговых окнах с сообщениями при запущенной программе НЕ из под IDE можно тоже нажать Ctrl+C и получить в буфере текст из окна сообщения. |
||
|
|||
Akella |
|
||
Творец Профиль
Репутация: 3
|
Расшифровка кода ошибки GetLastError С помощью SysErrorMessage(GetLastError)
Это сообщение отредактировал(а) Akella — 19.8.2010, 12:32 |
||
|
|||
ProgramerForever |
|
||
Опытный Профиль
Репутация: нет
|
Добавлю свои 5 копеек: |
||
|
|||
Akella |
|
||
Творец Профиль
Репутация: 3
|
это нужно писать на форуме блондинок, а не на форуме ПРОГРАММИСТОВ! |
||
|
|||
|
Правила форума «Центр помощи» | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Центр помощи | Следующая тема » |