【问题标题】:System.ComponentModel.Win32Exception when starting process - file not found, but file exists启动进程时出现 System.ComponentModel.Win32Exception - 找不到文件,但文件存在
【发布时间】:2012-12-08 02:52:18
【问题描述】:

我正在尝试为我的自动启动创建一个管理器。它应该读取一个 XML 文件,然后以自定义延迟启动我的程序。例如:

<startup id="0">
    <name>Realtek Audio Manager</name>
    <process arguments="-s">C:\Program Files\Realtek\Audio\HDA\RtkNGUI64.exe</process>
    <delay>5</delay>
</startup>

这会在 5 秒后运行指定的进程 (C:\Program Files\...\RtkNGUI64.exe -s)。

现在,三个程序无法启动,给我一个System.ComponentModel.Win32Exception:“Das System kann die angegebene Datei nicht finden。” ("系统找不到指定的文件。")

但是XML解析正确,我要启动的文件在我在XML文件中指定的位置。

问题只涉及这三个文件:
Intel HotkeysCmd - C:\Windows\System32\hkcmd.exe
英特尔 GFX 托盘 - C:\Windows\System32\igfxtray.exe
英特尔持久性 - C:\Windows\System32\igfxpers.exe

我认为问题出在文件的位置:它们都位于 C:\Windows\System32 中,而所有其他工作程序都位于外部(C:\Program Files、C:\Program Files (x86), D:\Program Files, %AppData%)

我是否必须授予我的程序某种访问权限才能在 C:\Windows\System32 中启动程序?我该怎么做?

如果不是,我在这些程序中出现错误的原因可能是什么?

编辑 - 我的代码:

delegate(object o)
{
    var s = (Startup) o;
    var p = new System.Diagnostics.Process
                {
                    StartInfo =
                        new System.Diagnostics.ProcessStartInfo(s.Process, s.Arguments)
                };
    try
    {
        s.Process = @"C:\Windows\System32\igfxtray.exe"; // For debugging purposes
        System.Diagnostics.Process.Start(s.Process);
        icon.ShowBalloonTip(2000, "StartupManager",
                            "\"" + s.Name + "\" has been started.",
                            System.Windows.Forms.ToolTipIcon.Info);
    }
    catch (System.ComponentModel.Win32Exception)
    {
        icon.ShowBalloonTip(2000, "StartupManager",
                            "\"" + s.Name + "\" could not be found.",
                            System.Windows.Forms.ToolTipIcon.Error);
    }
}

【问题讨论】:

  • 你有没有试过只是在做:System.Diagnostics.Process.Start(@"C:\Windows\System32\igfxtray.exe");我试过了(我的机器上有 igfxtray),完全没有错误。
  • 您使用的行也适用于我,但是当我使用变量 (System.Diagnostics.Process.Start(s.Process))(其中 s 是包含 string Processstruct Startup)时,它就无法启动,虽然s.Process == "C:\\Windows\\System32\\igfxtray.exe".
  • 可以禁用。在这里解决了:stackoverflow.com/questions/17487653/…

标签: c# exception file-access file-not-found win32exception


【解决方案1】:

很明显,您使用的是 64 位版本的 Windows。 c:\windows\system32 和 c:\program 文件目录受制于称为“文件系统重定向”的功能。这是一个 appcompat 功能,它有助于确保 32 位进程不会尝试使用 64 位可执行文件。他们将重定向到 c:\windows\syswow64 和 c:\program 文件 (x86)。

因此,当您尝试在 c:\program files\realtek\etcetera 中启动文件时,您的 32 位程序将被重定向到 c:\program files (x86)\realtek\etcetera。一个不存在的目录,kaboom。 igfxtray.exe 的成分相同

您需要更改程序的平台目标,以便它可以作为本机 64 位进程运行并避免您现在遇到的重定向问题。 Project + Properties,Build选项卡,将“Platform target”设置更改为AnyCPU。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多