如何修复获取父进程代码的GDI+访问违例问题,使其稳定运行?
问题分析与修复方案
原代码频繁触发GDI+访问违例的核心原因包括:WMI路径转义错误、未正确释放系统资源、未处理查询无结果或父进程已退出的异常场景。以下是修复后的代码及关键修改说明:
修复后的代码
private string ParentProcessName() { using (var currentProcess = Process.GetCurrentProcess()) { var queryFromId = $"SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {currentProcess.Id}"; // 使用@符号避免路径转义错误,并用using自动释放WMI资源 using (var searchById = new ManagementObjectSearcher(@"root\CIMV2", queryFromId)) using (var idResults = searchById.Get()) { foreach (var queryObject in idResults) { if (queryObject["ParentProcessId"] is uint parentId) { try { using (var parentProcess = Process.GetProcessById((int)parentId)) { return parentProcess.ProcessName; } } catch (ArgumentException) { // 父进程已退出时返回标识 return "ParentProcessExited"; } } } } } // 未查询到父进程信息时返回空值 return string.Empty; }
关键修改点
- 修正WMI路径转义:将
"root\CIMV2"改为@"root\CIMV2",避免反斜杠被解析为转义字符,确保WMI连接正常建立。 - 自动释放系统资源:对
Process、ManagementObjectSearcher、ManagementObjectCollection全部使用using语句,确保GDI等系统资源被及时回收,从根源避免访问违例。 - 完善异常与空值处理:
- 用
foreach遍历查询结果,替代直接操作枚举器的写法,避免MoveNext()失败后访问Current引发的空引用错误。 - 为
Process.GetProcessById添加异常捕获,处理父进程已退出的场景。 - 补充查询无结果时的返回逻辑,避免未处理的空值情况。
- 用
- 代码可读性优化:方法名改为帕斯卡命名法,使用字符串插值替代
string.Format,提升代码维护性。
内容的提问来源于stack exchange,提问作者VerpinZal
相关产品推荐
相关产品推荐

