0

CreateFile32 ビット XP OS での作業を使用して有効なハンドルを作成するために使用される次のコードがあります。64 ビット Vista および Windows 7 コンピューターで同じコードをテストするとCreateFile、無効なハンドル値が返されます。何が起こっているのか理解できないようです。

dll のインポートは次のとおりです。

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

そして呼び出し:

drive = CreateFile(devicePath,
           GENERIC_READ | GENERIC_WRITE,
           FILE_SHARE_READ | FILE_SHARE_WRITE,
           IntPtr.Zero,
           OPEN_EXISTING,
           FILE_FLAG_DELETE_ON_CLOSE,
           IntPtr.Zero);

devicePathUSBへの有効なパスです。これは、32 ビット OS では有効なハンドルを返し、64 ビット OS では無効な値を返します。私は検索して検索しましたが、何も見つかりませんでした。誰かが助けたり、情報を共有したりできれば、私は感謝します. よろしく。

4

2 に答える 2

2

AnyCPU用にコンパイルしていることを確認します。コンパイル対象がx86の場合、IntPtr32ビットと64ビットの両方のオペレーティングシステムで32ビットタイプになります。AnyCPU用にコンパイルすると、IntPtrデータ型にポインターのサイズを反映させることができます。

CreateFileAPIは(aka )のHANDLEエイリアスであるを返すため、64ビットOSでは64ビット長、32ビットOSでは32ビット長になります。PVOIDvoid*

x86用にコンパイルする場合、コードはAPIによって32ビット値が返されることを想定しています。実際には64ビットであるため、半分が失われ、無効なポインタが返されます。

于 2012-08-01T15:36:06.060 に答える