使用GetLastError -536870347 PInvoke UpdateDriverForPlugAndPlayDevices

时间:2014-09-23 20:55:48

标签: c# driver pinvoke

我尝试过三种不同的方式调用UpdateDriverForPlugAndPlayDevices。他们在这里:

 [DllImport("newdev.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    public static extern bool UpdateDriverForPlugAndPlayDevices(
        IntPtr hwndParent,
        [MarshalAs(UnmanagedType.LPWStr)] string HardwareId,
        [MarshalAs(UnmanagedType.LPWStr)] string FullInfPath,
        uint InstallFlags,
        ref bool bRebootRequired);

    [DllImport("newdev.dll", SetLastError = true, CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool UpdateDriverForPlugAndPlayDevices(
        [In, Optional]  IntPtr hwndParent,
        [In] string HardwareId,
        [In] string FullInfPath,
        [In] uint InstallFlags,
        [Out, Optional] bool bRebootRequired
        );

    [DllImport("newdev.dll", SetLastError = true)]
    public static extern bool UpdateDriverForPlugAndPlayDevices(
        IntPtr hwndParent,
        string HardwareId,
        string FullInfPath,
        uint InstallFlags,
        ref bool bRebootRequired
        );

无论我调用哪一个,返回的结果都是false,以下对Marshall.GetLastWin32Error()的调用给出错误代码-536870347。我已搜索并搜索过,但未找到任何此类错误代码。

我觉得问题在于我定义函数的方式,因为我可以将无意义的参数传递给我对UpdateDriverForPlugAndPlayDevices()的调用,但我仍然得到相同的错误代码。

之前的通话导致这项工作正常,我使用针对SetupDiGetClassDevsW()SetupDiEnumDeviceInfo()SetupDiGetDeviceRegistryProperty()SetupCopyOEMInf()的电话调用,他们都在预期的方式。

有人可以告诉我这个错误意味着什么,或者我做错了什么?谢谢!

2 个答案:

答案 0 :(得分:3)

  

给出错误代码-536870347

始终将这么大的数字转换为十六进制。你会得到0xE0000235。谷歌非常好,它是ERROR_IN_WOW64。或者换句话说,您无法在64位版本的Windows上从32位程序进行SetupDi调用。

右键单击EXE项目,“属性”,“构建”选项卡。删除抖动强制,使其以AnyCPU运行。如果你看到它,请取消“首选32位”选项。重复发布配置。

答案 1 :(得分:0)

    [DllImport("NewDev.dll", CharSet = CharSet.Auto, EntryPoint = "UpdateDriverForPlugAndPlayDevices")]
    [SecurityCritical]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal extern static bool UpdateDriverForPlugAndPlayDevices(IntPtr hwndParent,
                                                                [MarshalAs(UnmanagedType.LPWStr)]String szHardwordID,
                                                                [MarshalAs(UnmanagedType.LPWStr)]String szINFName,
                                                                uint installFlags, IntPtr bRebootRequired);