0

我试图在 C# 应用程序中从 Kernel32.dll 调用 CreateFile 方法,并且每次都返回无效句柄。我已经看遍了,找不到解决这个问题的方法。以下是相关代码:

常数:

    const UInt64 GENERIC_READ = 0x80000000L;
    const UInt64 GENERIC_WRITE = 0x40000000L;
    const UInt64 GENERIC_EXECUTE = 0x20000000L;
    const UInt64 GENERIC_ALL = 0x10000000L;
    const uint FILE_SHARE_READ = 0x00000001; 
    const uint FILE_SHARE_WRITE = 0x00000002;
    const uint OPEN_EXISTING = 0x00000003;
    const uint FILE_FLAG_DELETE_ON_CLOSE = 0x04000000;

导入方法:

[DllImport("kernel32.dll", SetLastError = true)]
    static extern unsafe SafeFileHandle CreateFile(
          string FileName,                   
          ulong DesiredAccess,                
          uint ShareMode,                    
          IntPtr SecurityAttributes,            
          uint CreationDisposition,           
          uint FlagsAndAttributes,            
          IntPtr hTemplateFile                   
          );
SafeFileHandle JFifoDrv = LoadDriver();

加载驱动程序的方法:

unsafe private SafeFileHandle LoadDriver()
    {
        SafeFileHandle hDrv = (SafeFileHandle)null;
        try
        {
            hDrv = CreateFile("\\\\.\\JFIFODRV",
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                (IntPtr)null,
                OPEN_EXISTING,
                FILE_FLAG_DELETE_ON_CLOSE,
                (IntPtr)null);

            DriverLoaded = true;
        }
        catch
        {
            poll.Stop();
            DriverLoaded = false;
        }

        return hDrv;
    }

任何人都可以帮我解决问题吗?

4

2 回答 2

3

您的声明是错误的,第二个参数是 uint,而不是 ulong。pinvoke.net 网站是一个不错的声明来源。当 JFifoDrv.IsInvalid 为真时,请务必抛出 Win32Exception。

于 2011-08-18T16:33:15.030 回答
0

我很确定这"\\\\.\\JFIFODRV"是一个无效的设备名称,它肯定不是一个有效的文件名。应该打开 F: 驱动器/分区之类的东西"\\\\.\\F:",尽管我很确定如果 F: 已安装,这将失败,因为您要求写访问权。

你想打开什么?

你也应该调用Marshal.GetLastWin32Error - 这将得到一个比“它不起作用”更详细的错误代码。

于 2011-08-18T16:12:14.583 回答