FormatMessage是WINDOWS提供的一个API,用来获取调用Windows API时返回的错误代码对应的文字信息,以前在VB下用过,但是在C#中还没用到,主要是不太了解Windows API在C#中调用的一些规则。
最近对VC++ WIN32开发手机程序突然有了极大的兴趣,捡起N久不用的C++,当然也就需要频繁和Windows API打交道了,写C#写多了,再用VB又有点不习惯,于是在C#下调用此方法。为什么不直接在C++中使用呢?嗯,手机调试比较烦,不想写太多代码,C#用起来还是要方便快捷得多。
DWORD WINAPI FormatMessage( __in DWORD dwFlags, __in LPCVOID lpSource, __in DWORD dwMessageId, __in DWORD dwLanguageId, __out LPTSTR lpBuffer, __in DWORD nSize, __in va_list* Arguments );
const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000;
const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x200;
[DllImp<wbr style="line-height:25px">ort("Kernel32.dll")]<br style="line-height:25px">
private static extern int FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, [Out]StringBuilder lpBuffer, uint nSize, IntPtr arguments);</wbr>
这是FormatMessage API原型和在C#中的定义,其中第2个和最后一个参数因为用不上,定义成IntPtr或int都可以,如果是int,调用时传入0,IntPtr的话,则传入IntPtr.Zero。
比较恼火的是lpBuffer这个参数,用来接收返回的文字信息,在VB中,这种类型的参数都是定义成ByVal String,然后用Space(长度)来初始化(把字符串初始化为指定长度的空格),调用时为nSize指定长度值即可。
在C#中我用类似的方法,参数定义为 string lpBuffer,调用时:
uint dwFlags=FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS;
string lpBuffer=new string(' ',260);
int count=FormatMessage(dwFlags,IntPtr.Zero,1439,0,lpBuffer,260,IntPtr.Zero);
通过返回值count可以知道函数调用成功,但lpBuffer的值却没有更改。
尝试改成ref和out都不行,ref直接报指针错误,out则函数调用失败。
后来想起C#中对string的处理类似于C,都是把它当作一个常量来处理,修改一个字符串的值实际上是抛弃该字符串而声明一个新字符串,显然这里不能把输出参数定义为字符串。
最后改成StringBuilder,并用[Out]属性修饰,调用时:
StringBuilder lpBuffer=new StringBuilder(260); //声明StringBuilder的初始大小
int count=FormatMessage(dwFlags,IntPtr.Zero,1439,0,lpBuffer,260,IntPtr.Zero);
成功!
分享到:
相关推荐
转发一个用VC6.0写的FormatMessage例程,方便大家学习,但程序里有个小漏洞~~~
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" _ (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, _ ByVal dwLanguageId As Long, ByVal lpBuffer As ...
如果FormatMessage函数运行成功,那么错误代码的文本描述就位于内存块中,我将它拷贝到对话框底部的滚动窗口中。如果FormatMesage函数运行失败,我设法查看NetMsg.dll模块中的消息代码,以了解该错误是否与网络有关...
windows错误代码信息显示程序,很简单 的一个错误代码信息显示,其中调用了formatmessage函数
它提供了一个单一的方法: formatMessage及其API受FormatJS对应的启发。动机FormatJS及其与Redux的React,Ember,Angular的对应绑定都很棒。 但是,在我的某些项目中有2个用例导致了这一点: 由于缺少ECMAScript ...
本文实例介绍了VC++通过API查看错误信息的方法,可以在遇到错误的时候,将显示出错信息并退出处理,具体的实现代码如下: if((m_hBitMap=(HBITMAP)::LoadImage(NULL,filepath,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_...
GetLastError 与 FormatMessage 连用,显示GetLastError返回值的各种含义;
init-react react 项目初始化架构,在redux官方购物车demo上修改而来。...国际化 2.x.x版本不支持直接在formatMessage方法嵌入reactElement,需升级到3.xx版本待商榷3.xx版本有部分Api变动。(如有
显示出错码详细原因的类,封装FormatMessage
react-forwardref-utils 实用工具来帮助React 16.3+ 方法 $ npm install --save react-forwardref-utils 用法 import { isForwardRef , forwardRefSymbol , forwardRefFactory , withForwardRef , ...
if (::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, 0, nErrorCode, LANG_USER_DEFAULT, (LPTSTR) &lpMsgBuf, 0, 0)) { strcpy( sMsg, ...
易语言渐变进度条源码,渐变进度条,TRIVERTEX到字节集,GradientFill,GetDC,ReleaseDC,GetLastError,FormatMessage
易语言渐变填充源码,渐变填充,TRIVERTEX到字节集,GradientFill,GetDC,ReleaseDC,GetLastError,FormatMessage
本能React React Native的React react-intl便利组件尽管react-intl允许我们使用formatMessage或传入函数,但是如果您必须为每个函数执行此操作,则这将很烦人。 该模块将完成后者并将其全部包装在Text组件中,从而...
列盘符,列虚拟盘符,映射磁盘,删除磁盘,取驱动器数,查询磁盘,QueryDosDevice,GetLastError,FormatMessage
关于该项目: 这个项目是专门为我学习websockets而设计的。 房间和事件的概念已被充分理解。... FormatMessage函数接收两个参数,这些参数将从客户端发送到传递该参数的服务器,这些参数是:codName,te
The Tomes of Delphi 3: Win32 Core API Help File by Larry Diehl <a href="../upload/20048171662237889.gif" target=_blank><IMG SRC="../upload/20048171662237889.gif" border=0 alt='按此在新窗口浏览...
在config.properties文件中编辑配置的第1节和第3节: # ********** SECTION 1 **********########## CustomProducer configurations ########### Message type should be used to define the kafka message format#...
void PrintLastError(char* Prefix)//打印出错信息,特别是里面的一个formatmessage()函数是用来 int FileDiskMount(int DeviceNumber,POPEN_FILE_INFORMATION OpenFileInformation,char DriveLetter,BOOLEAN...