2011-08-18 3 views
0

C# 응용 프로그램의 Kernel32.dll에서 CreateFile 메서드를 호출하려고하는데 잘못된 핸들을 반환하고 있습니다. 나는이 문제를 해결하지 못했습니다.C#의 Windows 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; 
    } 

는 사람은 나에게 문제를 알아내는 데 도움이 수 ?

답변

3

신고가 잘못되었습니다. 두 번째 인수는 ulong이 아닌 uint입니다. pinvoke.net 웹 사이트는 알맞은 선언 소스입니다. JFifoDrv.IsInvalid가 true 인 경우 Win32Exception을 throw해야합니다.

+0

그게 문제였습니다. 고마워. 끊임없는 선언이 길다는 사실은 저를 버렸습니다. – Luke

0

나는 "\\\\.\\JFIFODRV"이 잘못된 장치 이름이고 확실히 유효한 파일 이름이 아니라고 확신합니다. "\\\\.\\F:"과 같은 것은 F : 드라이브/파티션을 열어야합니다. 쓰기 액세스 권한을 요청할 때 F :가 마운트되어 있으면이 작업이 실패 할 것이라고 확신합니다.

개봉을 시도하고 있습니까?

또한 Marshal.GetLastWin32Error으로 전화해야합니다. "작동하지 않음"보다 자세한 내용의 오류 코드가 표시됩니다.

+0

이 프로그램의 원본 버전을 작성한 사람의 파일 이름이 있습니다. C#에서 모든 것을 다시하고 드라이버를로드해야합니다. 그것은 성능 데이터를 뿜어내는 드라이버입니다. – Luke

관련 문제