【问题标题】:Marshal.GetLastWin32Error() throws Access Denied in UWP C#Marshal.GetLastWin32Error() 在 UWP C# 中引发访问被拒绝
【发布时间】:2016-08-12 05:38:18
【问题描述】:

我的 UWP 应用中有以下代码

public static class DeviceIoControlHelper
    {
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
        private static extern SafeFileHandle CreateFile(
           string lpFileName,
           [MarshalAs(UnmanagedType.U4)] FileAccess dwDesiredAccess,
           [MarshalAs(UnmanagedType.U4)] FileShare dwShareMode,
           IntPtr lpSecurityAttributes,
           [MarshalAs(UnmanagedType.U4)] FileMode dwCreationDisposition,
           [MarshalAs(UnmanagedType.U4)] FileAttributes dwFlagsAndAttributes,
           IntPtr hTemplateFile);

public static SafeFileHandle ReturnFileHandler()
        {
            const string drive = @"\\.\LCD";

            SafeFileHandle hddHandle = CreateFile(drive, FileAccess.Read, FileShare.None, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);

            if (hddHandle.IsInvalid)
            {
                int lastError = Marshal.GetLastWin32Error();
                string errorMessage = string.Format(@"!! Invalid {0}; Error ({1}): {2}", drive, lastError, new Win32Exception(lastError).Message);
                throw new Win32Exception(errorMessage);
            }

            return hddHandle;
        }
}

但是,当我尝试从 MainPage.xaml.cs 访问它时,我得到了“拒绝访问”的异常。将 Visual Studio 2015 社区切换到管理员模式也无济于事

public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();

            try
            {
                DeviceIoControlHelper.ReturnFileHandler();
            }
            catch(Exception ex)
            {

            }
        }
}

我在 Visual Studio 2015 社区中使用 UWP 和 C#

【问题讨论】:

  • 它不起作用也就不足为奇了。 UWP 应用是沙盒化的。

标签: c# win-universal-app deviceiocontrol


【解决方案1】:

您需要使用CreateFile2 来使用通用 Windows 应用程序打开文件。但是,它不允许您打开设备。引用 MSDN: 当从 Windows 应用商店应用程序调用时,CreateFile2 被简化。您只能打开 ApplicationData.LocalFolder 或 Package.InstalledLocation 目录中的文件或目录。

【讨论】:

  • 感谢您的建议。尝试使用 CreateFile2 - 没有运气:( ...同样的错误“访问被拒绝”
  • 感谢您的编辑。在这种情况下,CreateFile2 的第一个参数是什么?目前我正在传递:const string drive = @"\\.\LCD"; in CreateFile
  • siam,你想调整液晶显示器的亮度吗?如果是这样,您可以尝试 WmiMonitorBrightness 类。
  • 我尝试使用 WmiMonitorBrightness,它不适用于带有 System.Automation dll 的 UWP :( .
猜你喜欢
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多