.NET(C#):使用Win32Exception类型处理Win32错误代码

.NET(C#):使用Win32Exception类型处理Win32错误代码

2012年02月27日 ⁄ 综合 ⁄ 共 1753字 ⁄ 字号 小 中 大 ⁄ 评论关闭
 

此类型在System.ComponentModel命名空间内,而不是你可能认为的System.Runtime.InteropServices命名空间内。

 

Console.WriteLine(Marshal.GetLastWin32Error());
Console.WriteLine(new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()).Message);

但是他的父类:ExternalException,则是在System.Runtime.InteropServices命名空间内。

image

 

ExternalException的父类是SystemException(当然现在SystemException和ApplicationException该继承哪个界限已经很模糊了)。注意ExternalException多了一个ErrorCode属性返回的是父类Exception的HResult属性,同时在ExternalException的构造函数中可以设置HResult属性,但是Win32Exception并没有使用这个HResult的,Win32Exception仅设置父类的Message属性,也就是说Win32Exception中的ExternalException的ErrorCode始终是保持默认值的。

 

而Win32Exception自己定义了一个属性值:NativeErrorCode,同样是int类型。Win32Exception可以设置三个属性,NativeErrorCode,Exception的Message,和Exception的InnerException属性。InnerException没有特殊的地方,前两个属性有这样的特点:

1. 可以通过构造函数设置他们的值。

2. 如果只设置NativeErrorCode,那么Message会是相应Win32错误代码的文字描述。

3. 如果只设置Message,那么NativeErrorCode会是Marshal.GetLastWin32Error方法的返回值。

4. 如果什么都不设置,那么2和3都会被应用。

 

这些都是非常有用的,尤其是第2项,这个可以代替另一个Win32 API:FormatMessage,开发人员就不需要再次平台调用FormatMessage API,直接使用Win32Exception则可以。

 

比如随便举一个Win32错误代码:17,代表“无法将文件移动到不同的磁盘中”(可以参考:System Error Codes

 

代码:

Console.WriteLine(new System.ComponentModel.Win32Exception(17).Message);

 

 

输出(我的系统是英文的,在中文系统会输出中文):无法将文件移动到不同的磁盘中

 

 

 

接下来试试自动调用GetLastWin32Error方法,随便试一个API比如DeleteFile API。这样定义平台调用:

//+ using System.Runtime.InteropServices;

[DllImport("kernel32.dll", SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

static extern bool DeleteFile(string lpFileName);

 

 

如果出错的话,可以一般是这样处理错误:

//+ using System.Runtime.InteropServices;

if (!DeleteFile("123"))

{

    //获取错误代码

    int errorCode = Marshal.GetLastWin32Error();

    //输出错误信息

    //使用FormatMessage或者Win32Exception.Message

}

 

 

其实还可以更快的,就是用Win32Exception的默认构造函数:

//+ using System.ComponentModel;

if (!DeleteFile("123"))

    Console.WriteLine(new Win32Exception().Message);

 

 

此时Marshal.GetLastWin32Error和Win32错误代码的描述都会被解决,于是代码会输出“文件未找到”的字样:

The system cannot find the file specified

转载于:https://www.cnblogs.com/lasthelloworld/p/4961549.html

C#蓝牙控制开发:工业物联网低功耗通信实践 蓝牙低功耗(BLE)技术作为现代物联网的核心通信协议,通过2.4GHz频段实现设备间高效数据传输。其采用GATT协议分层架构,支持主从设备动态连接,特别适合需要长期运行的电池供电场景。在工业物联网领域,结合C#的异步编程模型和.NET跨平台能力,开发者可以快速构建稳定可靠的蓝牙控制系统。典型应用包括设备状态监控、远程指令下发等场景,例如通过STM32控制器实现200ms响应的机床急停功能。实测表明,基于C# WinRT API的方案相比Python提升3倍处理速度,同时保持仅C++方案40%的代码量,显著提 阅读详情

相关推荐

Windows Mobile开发:Native C++与.NET Compact Framework技术选型指南

在嵌入式移动开发中,Native代码与托管运行时的权衡是资源受限系统的核心命题。理解PE/COFF可执行格式与IL/JIT执行模型的本质差异,有助于把握性能确定性与开发敏捷性的根本张力。Native C++提供对内存、硬件和时序的完全控制,适用于工业PDA、实时采集等强确定性场景;而.NET Compact Framework通过精简类库与轻量级GC,在企业OA、快速迭代界面等业务密集型应用中显著降低全周期成本。二者并非替代关系,而是分层协作——Native承担‘第一公里’硬件初始化与‘最后一公里’数据落盘

SailingAptech的专栏 878

系统无法访问提示“配额不足无法处理此命令“的解决思路

电脑系统出现无法访问C:Documents and SetAdministrator,配额不足。

惠惠软件 1922

深入GetDlgItem:Windows控件编程从高级封装到底层句柄操作

在Windows桌面应用开发中,控件操作是GUI编程的核心基础。从高级框架如WinForms的面向对象模型,到底层基于窗口句柄的消息机制,构成了GUI编程的不同抽象层次。理解窗口句柄与控件ID的概念,是掌握Windows GUI底层原理的关键。GetDlgItem作为经典的Windows API,通过父窗口句柄和控件ID获取子控件句柄,实现了从对话框资源到具体控件的精准定位。这一机制在动态控件访问、跨进程操作、自动化测试等场景中具有重要技术价值,特别是在处理非托管代码交互、底层消息派发等高级需求时不可或缺。

cuankuangzhong6373的博客 452

C#为何成为2002年开发者的技术破局点

面向对象编程(OOP)作为软件工程核心范式,其落地长期受限于语法抽象与工程实践的鸿沟;GUI开发则因操作系统API复杂、工具链割裂而成为初学者难以逾越的断层。在硬件资源匮乏、教学体系滞后、IDE响应迟缓的早期开发环境中,C#凭借确定性资源管理(using语句)、封装完备的WinForms类库、以及Visual Studio .NET的智能感知与重构能力,将OOP从理论概念转化为可快速验证的工程实践。它不追求语言学上的极致优雅,而是以降低学习成本、缩短反馈周期、规避内存与异常陷阱为技术价值,支撑起桌面应用、课

diaojin6880的博客 388

【语言-c#】126 :找不到指定的模块。

背景介绍 用Mircrsoft Visual Studio 启动程序代码时,System.Runtime.InteropServices.Marshal.GetLastWin32Error()报如下错误: “System.ComponentModel.Win32Exception类型的未经处理的异常在 System.Windows.Forms.Keyboard.exe 中发生 其他信息:...

少莫千华 1708

Win32Exception: ApplicationName='xx', CommandLine='xx',CurrentDirectory='xx'

这个错误是由于启动进程导致的,首先在命令行模式下输入ApplicationName,如果能正常运行,则说明是CommandLine有问题。如果不能正常运行则考虑对应程序是否支持命令行模式。不支持自行百度。

kxfeng1的专栏 4326

could't excute 请求的操作需要提升 win32 error 740

win7下修改VC的启动程序“"x:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\Bin\MSDEV.EXE"”以及所需生成的程序的属性使其“以管理员身份运行”(在属性->兼容性中)即可

Stay hungry,stay foolish 3630

Win32Exception: ApplicationName=‘“D:\XXX\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe“‘,

打包安卓包时报错, 主要是因为在SDK/tools路径下没有找到zipalign.exe文件, 可在SDK\build-tools下复制该文件至SDK/tools

qq_34243277的博客 3003

C#动态修改Windows默认打印机:从Win32 API调用到权限处理的完整指南

在Windows桌面应用开发中,系统集成与硬件控制是常见的工程需求,其中打印机管理尤为关键。其核心原理是通过Win32 API与操作系统底层交互,实现对打印队列和用户配置的编程控制。这项技术的价值在于能够实现业务流程自动化,例如根据单据类型自动切换打印机,从而提升办公效率。典型的应用场景包括企业ERP系统、票据打印工具和桌面自动化脚本。本文将深入解析C#通过P/Invoke调用SetDefaultPrinter函数的方法,并重点探讨用户权限与UAC提升等避坑要点,提供可直接复用的健壮代码模块。

weixin_34185320的博客 437

C#实现Windows系统电源管理:注销、关机、重启的完整方案

在Windows桌面应用开发中,系统电源管理是常见的功能需求,涉及操作系统底层API的调用与权限管理。其核心原理是通过进程管理接口调用系统工具实现电源操作,技术价值在于提供稳定、安全的系统控制能力,避免数据丢失和权限问题。应用场景广泛,包括系统工具、管理软件、自动化脚本等。本文基于C#编程和Windows API,详细解析了通过shutdown.exe命令和Process类实现电源管理的完整方案,涵盖了异常处理、用户交互和权限提升等工程实践要点,为开发者提供即插即用的解决方案。

djph26741的博客 461

C#调用浏览器(默认和非默认浏览器)

调用 IE: System.Diagnostics.Process myProcess = new System.Diagnostics.Process(); myProcess.StartInfo.FileName = "iexplore.exe"; myProcess.StartInfo.Arguments = " http://www.net0and1.com/"; myProcess.St...

weixin_33936401的博客 260

C# GDI+发生一般性错误(A generic error occurred in GDI+)

本文总结了C# GDI+出现"A generic error occurred in GDI+"错误的解决方法。首先建议使用Marshal.GetLastWin32Error()获取底层错误代码,并提供了常见错误代码的解析:ERROR_PATH_NOT_FOUND(路径不存在)、ERROR_ACCESS_DENIED(权限不足)和ERROR_SHARING_VIOLATION(文件被占用)。特别针对文件被占用的情况,给出了通过创建新Image对象并拷贝数据的解决方案。此外还提到可能导致错误的其他因素,如图像

黄同学的博客 5434

Visual Studio集成Halcon C#开发:从环境配置到部署实战指南

机器视觉开发涉及图像处理、算法实现与软件集成等多个核心环节。其基本原理是通过计算机模拟人类视觉,对图像进行分析和理解,从而完成检测、识别、测量等任务。这项技术的价值在于能够实现自动化、高精度和可重复的视觉检测,大幅提升工业生产和质量控制效率。在实际应用中,开发者常使用功能强大的专业库,如Halcon,它提供了丰富的算子,能高效处理复杂的视觉问题。将Halcon集成到C#项目中,特别是在Visual Studio开发环境下,是打通视觉算法与上层应用的关键一步。这涉及到环境配置、DLL引用、许可证管理等工程实践

weixin_34176694的博客 388

ConsoleControl错误处理与调试:常见问题排查与解决方案清单

ConsoleControl是一个强大的C#类库,它允许开发者在WinForms或WPF应用程序中嵌入控制台界面。这个终极指南将为您提供完整的错误处理与调试技巧,帮助您快速解决ConsoleControl集成过程中遇到的常见问题。无论您是新手还是有经验的开发者,这份清单都将成为您调试ConsoleControl应用程序的宝贵工具。 ## 🔍 ConsoleControl常见错误类型与诊断方法

gitblog_00057的博客 475

(C# SQL Server) 数据库连接字符串

Debug 一个SQL Server 2008 数据库连接的问题,老是提示: [67944]System.Data.SqlClient.SqlException(0x80131904):在与SQLServer建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且SQLServer已配置为允许远程连接。(provider:SQLNe...

weixin_30873847的博客 6677

SqlException只报Number怎么办?

错误源 SqlError.Number SqlError.State SqlException 具有内部 Win32Exception (.NET Framework 4.5 开始) 来自服务器的错误 服务器错误代码 该数字与 master.dbo.sysmessages 表中的项对应。 通常大于

阿达King哥的博客 2092

深度优化Vosk-API跨平台部署的5种实战方案

Vosk-API作为离线语音识别领域的核心技术,为开发者提供了多语言、低延迟的语音转文本解决方案,但在Windows平台部署时经常遇到DLL加载失败、架构不匹配和依赖缺失等难题。本文系统分析Vosk-API在Windows环境下的技术痛点,提供从基础部署到高级优化的完整解决方案,帮助开发者实现高效的离线语音识别集成。 ## 技术痛点分析与影响范围 Windows平台上的Vosk-API部署问题

gitblog_00063的博客 609

C#调用WinMM实现游戏手柄输入捕获与键盘映射

游戏手柄输入是Windows桌面应用中常见的外设交互需求,其底层依赖于操作系统提供的多媒体输入API。WinMM.dll作为Windows原生支持的轻量级手柄接口,无需DirectX运行时,兼容Win7至Win11,具备低开销、高稳定、易部署的技术优势。其核心机制基于消息驱动的被动捕获模式(joySetCapture),通过窗口消息(如MM_JOY1MOVE)实时接收手柄状态,避免轮询带来的CPU占用与漏帧风险。在工程实践中,需结合结构体内存布局控制、ANSI字符串编码适配、WParam/LParam二进制

dianlu5775的博客 600
上一篇: 公众平台服务号、订阅号、企业号的相关说明
下一篇: 高德地图SDK大致使用
weixin_33805992
博客等级 码龄11年 5980粉丝 722原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值