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

あなたの宣言は間違っています。2番目の引数はuintであり、ulongではありません。pinvoke.net Webサイトは、宣言の適切なソースです。JFifoDrv.IsInvalidがtrueの場合は、必ずWin32Exceptionをスローしてください。

于 2011-08-18T16:33:15.030 に答える
0

これは"\\\\.\\JFIFODRV"無効なデバイス名であり、有効なファイル名ではないことは確かです。F: ドライブ/パーティション"\\\\.\\F:"を開く必要がありますが、書き込みアクセスを要求しているため、F: がマウントされている場合、これは失敗すると確信しています。

何を開こうとしていますか?

また、 Marshal.GetLastWin32Errorを呼び出す必要があります。これにより、「動作しませんでした」というよりも詳細なエラー コードが取得されます。

于 2011-08-18T16:12:14.583 に答える