0

CreateFile我有以下代码用于在 32 位 XP 操作系统上创建有效句柄。在 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);

devicePath是 USB 的有效路径。这在 32 位操作系统上返回一个有效句柄,在 64 位操作系统上返回一个无效值。我找了又找,一无所获。如果有人可以提供帮助或分享一些信息,我将不胜感激。问候。

4

2 回答 2

2

验证您正在为AnyCPU进行编译。如果您的编译目标是 x86,那么您将在IntPtr32 位和 64 位操作系统上都有 32 位类型。为 AnyCPU 编译允许IntPtr数据类型反映指针的大小。

CreateFileAPI 返回HANDLE,它是PVOID(aka )的别名void*,因此它在 64 位操作系统上为 64 位长,在 32 位操作系统上为 32 位长。

当您针对 x86 进行编译时,代码需要 API 返回一个 32 位的值。因为它实际上是 64 位的,所以你丢失了一半,给你一个无效的指针。

于 2012-08-01T15:36:06.060 回答
0

值得一提的是(因为很多人都弄错了)在 64 位 Windows 上,句柄可以安全地截断为 32 位。

这允许句柄与 32 位应用程序(但不是 16 位应用程序)兼容,而无需特殊的“句柄转换”thunking。

反过来,截断的 32 位句柄可以安全地符号扩展为 64 位。(无效句柄 -1 必须通过符号扩展)

MSDN“运行 32 位应用程序” “句柄在 64 位 Windows 上具有 32 个有效位。”

于 2016-11-03T04:45:44.383 回答