Delphi - ErrorCode查询

技术交流,DH.

我们一般在调用了一些API后都会用GetLastError来获得错误信息,但是信息都是Integer的,我们知道是什么意思么?
嘿嘿,是的,有msdn呀,当然还可以用FormatMessage函数来.
正好看了下Windows核心编程第一章有个例子,来用Delphi试一下.
主要用了FormatMessage函数,具体用法和注意事项就很多了,大家可以看MSDN了.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Unit UtMain;
 
Interface
 
Uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  CxGraphics,
  CxControls,
  CxLookAndFeels,
  CxLookAndFeelPainters,
  CxContainer,
  CxEdit,
  DxSkinsCore,
  DxSkinSeven,
  CxGroupBox,
  CxCheckBox,
  CxTextEdit,
  DxSkinsForm,
  CxLabel,
  Menus,
  CxMemo,
  StdCtrls,
  CxButtons;
 
Type
  TForm3 = Class(TForm)
    Cxlbl1: TcxLabel;
    DxSkinController1: TdxSkinController;
    CxtxtCode: TcxTextEdit;
    CxchkHex: TcxCheckBox;
    GrpDescription: TcxGroupBox;
    BtnSearch: TcxButton;
    CxmDescription: TcxMemo;
    Procedure BtnSearchClick(Sender: TObject);
    Procedure FormCreate(Sender: TObject);
  Private
    { Private declarations }
 
    DwCode: Cardinal;
    SystemLocale: Cardinal;
  Public
    { Public declarations }
  End;
 
Var
  Form3: TForm3;
 
Implementation
 
{$R *.dfm}
 
Procedure TForm3.BtnSearchClick(Sender: TObject);
Var
  B: Cardinal;
  HLib: Cardinal;
  Buf: PChar;
Begin
  If CxchkHex.Checked Then
    DwCode := StrToIntDef('$' + CxtxtCode.Text, 0)
  Else
    DwCode := StrToIntDef(CxtxtCode.Text, 0);
  GetMem(Buf, 256);
  Try
    // 尝试获取一下
    B := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, Nil, DwCode, SystemLocale,
      Buf, 255, Nil);
    // 如果默认没有 查询下网络相关的
    If B = 0 Then
    Begin
      HLib := LoadLibraryEx('netmsg.dll', 0, DONT_RESOLVE_DLL_REFERENCES);
      Try
        Assert(HLib <> 0);
        B := FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, Pointer(HLib), DwCode,
          SystemLocale, Buf, 255, Nil);
      Finally
        If HLib <> 0 Then
          FreeLibrary(HLib);
      End;
    End;
    If (B <> 0) Then
      CxmDescription.Text := Buf
    Else
      CxmDescription.Text := '没有找到错误码的相关描述';
 
  Finally
    FreeMem(Buf);
  End;
End;
 
Procedure TForm3.FormCreate(Sender: TObject);
Begin
  // 设置语言为默认
  SystemLocale := MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)
End;
 
End.

我为了要dx的皮肤,所以这里用到了DevExpress控件,但是没有用到控件的其他功能,所以大家如果没有安装Dev,可以直接换成最普通的Button这些控件就可以了额.
来个图片看一下:
image

posted @   HuangJacky  阅读(1843)  评论(2编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
AdminLogin
点击右上角即可分享
微信分享提示