C#中的Windows CreateFile返回无效句柄

C#中的Windows CreateFile返回无效句柄,c#,createfile,kernel32,C#,Createfile,Kernel32,我试图在C#应用程序中从Kernel32.dll调用CreateFile方法,每次它都返回一个无效句柄。我已经找遍了,找不到解决这个问题的办法。以下是相关代码: 常数: const UInt64 GENERIC_READ = 0x80000000L; const UInt64 GENERIC_WRITE = 0x40000000L; const UInt64 GENERIC_EXECUTE = 0x20000000L; const UInt64 GENERIC_A

我试图在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;
    }

有人能帮我解决这个问题吗?

我很确定
“\\\\\.\\JFIFODRV”
是一个无效的设备名,而且肯定不是一个有效的文件名。类似于
“\\\\.\\F:“
应该打开F:drive/分区,尽管我很确定如果装载了F:,当您请求写访问时,这将失败

你想打开什么


此外,您还应该调用-这将得到一个错误代码,其详细信息不仅仅是“它不工作”

我非常确定
“\\\.\\JFIFODRV”
是一个无效的设备名,而且肯定不是一个有效的文件名。类似于
“\\\\.\\F:“
应该打开F:drive/分区,尽管我很确定如果装载了F:,当您请求写访问时,这将失败

你想打开什么


此外,您还应该调用-这将得到一个错误代码,其详细信息不仅仅是“它不工作”

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

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

这就是问题所在。谢谢。常量声明是long这一事实让我很反感,这就是问题所在。谢谢。常量声明是长的这一事实让我很反感。我从编写这个程序原始版本的人那里得到了文件名。我正在用C#重新做整个事情,需要加载那个驱动程序。它是一个可以输出性能数据的驱动程序。我从编写这个程序原始版本的人那里得到了文件名。我正在用C#重新做整个事情,需要加载那个驱动程序。它是一个可以输出性能数据的驱动程序。