You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复获取父进程代码的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:11:12