【问题标题】:C# OpenProcess returns error 1150C# OpenProcess 返回错误 1150
【发布时间】:2017-12-22 11:24:31
【问题描述】:

这是我编写的打开进程的代码:

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern UIntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool CloseHandle(UIntPtr hObject);

        private const uint PROCESS_QUERY_INFORMATION = 0x0400;

        public static void processInfo() {
            uint PID = 3144;
            UIntPtr handle = UIntPtr.Zero;
            handle = OpenProcess(PROCESS_QUERY_INFORMATION, false, PID);
            Console.WriteLine(Marshal.GetLastWin32Error());
            Console.WriteLine(handle);
            if (!handle.Equals(UIntPtr.Zero)) {
                CloseHandle(handle);
            }
        }

Marshal.GetLastWin32Error() 为任何进程返回错误 1150。来自 MSDN:

"ERROR_OLD_WIN_VERSION:指定的程序需要更新的版本 窗户。”

我在 Visual Studio 2015 Community Edition 的 Windows 2008 R2 中运行此代码。 Target Framework 在项目设置中设置为“.NET Framework 4.5.2”。

此外,OpenProcess 似乎仍然能够完成它的工作,因为返回的句柄不为零。我应该担心这个错误吗?

【问题讨论】:

    标签: c# winapi dllimport


    【解决方案1】:

    来自文档:

    如果函数成功,返回值是一个打开的句柄 指定进程。

    如果函数失败,返回值为NULL。获得扩展错误 信息,请致电GetLastError

    请注意,调用GetLastError 的唯一提及是函数失败时。这由返回值指示。仅在函数失败时检查错误代码,它只有在这种情况下才有意义。你的错误是无条件检查错误码。

    handle = OpenProcess(...);
    if (handle == UIntPtr.Zero)
        // only now call Marshal.GetLastWin32Error
    

    还要注意,分配handle 两次是没有意义的。你写道:

    UIntPtr handle = UIntPtr.Zero;
    handle = OpenProcess(...);
    

    编译器肯定警告说这是没有意义的,分配给句柄的值没有被使用。您的代码有点类似于:

    int i = 1;
    i = 2;
    

    我敢肯定你永远不会这样做。你的代码应该是:

    UIntPtr handle = OpenProcess(...);
    

    【讨论】:

      【解决方案2】:

      我不知道你的代码有什么问题,但这是一个非常简单的实现,我已经测试过它可以工作。请记住,您必须以管理员身份运行。

      using System;
      using System.Diagnostics;
      using System.Runtime.InteropServices;
      
      namespace ConsoleApp3
      {
          class Program
          {
              [Flags]
              public enum ProcessAccessFlags : uint
              {
                  All = 0x001F0FFF,
                  Terminate = 0x00000001,
                  CreateThread = 0x00000002,
                  VirtualMemoryOperation = 0x00000008,
                  VirtualMemoryRead = 0x00000010,
                  VirtualMemoryWrite = 0x00000020,
                  DuplicateHandle = 0x00000040,
                  CreateProcess = 0x000000080,
                  SetQuota = 0x00000100,
                  SetInformation = 0x00000200,
                  QueryInformation = 0x00000400,
                  QueryLimitedInformation = 0x00001000,
                  Synchronize = 0x00100000
              }
      
              [DllImport("kernel32.dll", SetLastError = true)]
              public static extern IntPtr OpenProcess(
              ProcessAccessFlags processAccess, bool bInheritHandle, int processId);
              static void Main(string[] args)
              {
                  Process proc = Process.GetProcessesByName("ac_client")[0];
      
                  var hProc = OpenProcess(ProcessAccessFlags.All, false, proc.Id);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多