1、获取错误信息
- #include
- #include
- #include
-
- int main()
- {
- fopen("D:\\ASC", "r");
- printf("%s\n", strerror(errno));
- getchar();
- return 0;
- }
2、设置错误信息
- #include
- #include
- #include
-
- int main()
- {
- fopen("D:\\ASC", "r");
- _set_errno(0);
- printf("%s\n", strerror(errno));
- getchar();
- return 0;
- }
1、获取错误编号

2、设置错误编号

3、用工具获取错误代码对应的错误信息

4、错误代码各个位数的意义

这是windows的API函数,函数是用来将错误编码转换成错误信息字符串的
在UNICODE编码下被定义为FormatMessageW,我们常用FormatMessageW
详细内容可见windowsAPI:FormatMessageW 函数 (winbase.h) - Win32 apps | Microsoft Learn
- FormatMessageW(
- _In_ DWORD dwFlags,
- _In_opt_ LPCVOID lpSource,
- _In_ DWORD dwMessageId,
- _In_ DWORD dwLanguageId,
- _When_((dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) != 0, _At_((LPWSTR*)lpBuffer, _Outptr_result_z_))
- _When_((dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) == 0, _Out_writes_z_(nSize))
- LPWSTR lpBuffer,
- _In_ DWORD nSize,
- _In_opt_ va_list *Arguments
- );
DWORD dwFlags
标志1:FORMAT_MESSAGE_ALLOCATE_BUFFER
0x00000100
有这个标志表示这个函数自动分配内存,我们必须给参数lpBuffer,使用这种方式来传递一个未初始化指针变量,(LPTSTR)&lpBuffer。当这个函数返回的时候,这个指针变量就指向一段内存,这个内存中就存放着我们想要的字符串。如果要释放这段内存,就要使用函数LocalFree(这说明FormatMessage函数使用LocalAlloc函数来分配内存)
标志2:FORMAT_MESSAGE_ARGUMENT_ARRAY
0x00002000
Arguments参数是一个数组,不是va_list这种类型的参数
标志3:FORMAT_MESSAGE_FROM_HMODULE
0x00000800
这个标志说明,这个函数接收一个DLL模块,从DLL模块中查找字符串(因为有的错误号,在windows系统API里面还没定义,所以需要另外加DLL,那个里面有错误号对应的错误信息字符串)
标志4:FORMAT_MESSAGE_FROM_STRING
从一个字符串中查找消息字符串
标志5:FORMAT_MESSAGE_FROM_SYSTEM
0x00001000
从系统中,获取消息字符串,不是从某个指定的字符串或者DLL中获取消息字符串
标志6:FORMAT_MESSAGE_IGNORE_INSERTS
0x00000200
这个表示说明参数Arguments是否有用,如果设置了这个标志,那么参数Arguments就被函数忽略
LPCVOID lpSource
从哪里获取消息字符串?如果是从系统获取消息字符串的画,这个参数为NULL
DWORD dwMessageId,
消息索引
DWORD dwLanguageId,
消息的语言种类
LPWSTR lpBuffer
接受消息的内存块指针
DWORD nSize
接受消息的内存块大小
va_list *Arguments
消息中有些变量的值
如果函数成功,返回字符消息的字符数
如果函数失败,返回0,用GetLastError函数获取错误信息




把上面的函数改成系统分配内存,改动如下

- void CMFCApplication1Dlg::OnBnClickedButton1()
- {
- // TODO: 在此添加控件通知处理程序代码
- TCHAR* str = NULL;
- this->UpdateData(1);
- int count = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
- NULL, m_value, NULL, (LPWSTR)&str, 200, NULL);
- if (!count)
- {
- this->SetDlgItemTextW(IDC_STATIC1, str);
- LocalFree(str);
- }
- else
- {
- HMODULE hmodule = LoadLibrary(TEXT("netmsg.dll"));
- if (hmodule)
- {
- count = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
- hmodule, m_value, NULL, (LPWSTR)&str, 0, NULL);
- if (count)
- {
- this->SetDlgItemTextW(IDC_STATIC1, (LPCTSTR)LocalLock(str));
- LocalFree(str);
- }
- FreeLibrary(hmodule);
- }
- if (!count)
- {
- this->SetDlgItemTextW(IDC_STATIC1, (LPCTSTR)L"没有找到错误代码信息");
- }
- }
- }
为了好看,初始化的时候给他加入了这个代码

VOID:这个函数不可能失败
BOOL:FALSE失败;TRUE 成功
HANDLE:失败返回NULL,否则返回非零句柄。如果有特殊说明,则可能为特殊值例如:INVALID_HANDLE_VALUE
PVOID:返回一个内存地址,失败为NULL
LONG/DWORD:应该根据SDK说明来确定函数状况。