在WinAPI上,HANDLE类型定义为void *,因此在64位应用程序上,HANDLE值的范围可以为0到18446744073709551615。
但实际上是真的吗?任何文件是否指定了这样一个手柄的整体范围?

如果一个人希望将这个HANDLE存储在一个32位应用程序上的一个int32_t,这是完全正常的,但是在64位应用程序上,这个疑问就是这样。

MSDN声明:

64-bit versions of Windows use 32-bit handles for interoperability.
When sharing a handle between 32-bit and 64-bit applications,only the
lower 32 bits are significant,so it is safe to truncate the handle
(when passing it from 64-bit to 32-bit) or sign-extend the handle
(when passing it from 32-bit to 64-bit). Handles that can be shared
include handles to user objects such as windows (HWND),handles to GDI
objects such as pens and brushes (HBrush and HPEN),and handles to
named objects such as mutexes,semaphores,and file handles.

也值得注意的是在该页面上添加了此评论:

The proper way to share such handles across process boundaries is by
zero-extending 32 bits handles to 64 bits,or vice versa by truncating
64 bits handles to 32 bits discarding the top bits.

请注意“句号扩展”句柄与“零延伸”句柄之间的区别。

编辑:从对这个问题的删除答案中的讨论来看,我认为扩展一个32位句柄来达到64位句柄而不是零扩展的意义在于保留对INVALID_HANDLE_VALUE的适当处理一个句柄的值。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx

64位应用程序上的Windows HANDLE的范围是多少?的更多相关文章

  1. Android:SlidingDrawer在SurfaceView下消失

    解决方法机器人:背景=“#00000000”背景颜色是问题.

  2. android – 添加按钮到SlidingDrawer句柄?

    谢谢Aedon解决方法您可以将布局XML中的SlidingDrawer元素中的属性解释为句柄按钮的“打开”操作.喜欢这个:只是让android:allowSingleTap=“false”然后只要按照一般的方式实现按钮的点击处理程序.这将阻止它打开/关闭抽屉,但您可能需要截取按钮的事件,以使其执行您想要的操作.

  3. JavaScript中添加监听句柄的方式

    这篇文章主要介绍了JavaScript中添加监听句柄的方式,监听就是触发某事件之后做出的响应,监听句柄是触发某相应的条件,下面关于添加监听句柄的方式的详细内容,需要的朋友可以参考一下,希望对你有所帮助

  4. 在Windows上禁用或刷新页面缓存

    ),它允许您在没有适当的权限的情况下使卷的缓存无效,仅仅通过在没有共享写入的情况下注册打开它,至少在一个最新版本的Windows.当任何对写入有效的打开成功,因为你可以改变文件系统内部数据这样做时,这是完全合理的,但显然它在打开卷失败时也有效.

  5. 如何从Win32中的func ptr获取Module HANDLE?

    我正在为虚拟机进行本机调用绑定,其中一个功能是能够在运行时按名称查找标准libc函数.在Windows上,这会变得有点麻烦,因为我需要获取当前在进程中加载的msvcrt模块的句柄.通常这是msvcrt.dll,但它也可能是其他变种,如果使用具有不同名称的变体,则对GetModuleHandle的调用可能会失败.我希望能够做的是反向查找,从libc中获取函数指针并获得提供它的模块的句柄.基本上,这样的事情:在win32API中是否有这样的东西,而不是下载到进程句柄和符号表的手动遍历?

  6. windows – 这是什么意思:“子进程可以继承句柄”?

    根据SDK,有一些Win32对象可以“继承”到给定进程创建的子进程.(事件,互斥体,管道……)这究竟意味着什么?假设我有一个使用CreateEvent创建的命名事件对象,一次使用bInheritHandle==true,另一次使用==false.现在我开始一个子进程.这两个事件句柄如何影响子进程?它们在哪些情况下有所不同?

  7. windows – 删除Node.js中的文件

    我在Windows环境中使用节点.当我使用fs.unlinkSync时,它似乎工作.执行unlinkSync语句后,如果我执行fs.existsSync,则返回false表示文件不存在,但是当我转到物理驱动器时,我仍然可以看到该文件.此时如果我尝试手动删除文件,则会抛出拒绝访问权限.但是,仅当我停止执行节点脚本文件时,才会自动从文件系统中删除该文件.这是预期的行为吗?

  8. windows – 在不同进程之间共享HDC

    我正在编写某种IPC功能,需要将某些资源从一个进程传递到另一个进程.这适用于Pipehandle等,可以通过DuplicateHandle复制.现在我需要将HDC从一个进程传递到另一个进程.这甚至可能吗?

  9. windows – 如何在具有句柄时检查给定进程是否正在运行

    我正在使用ShellExecuteEx来启动一个应用程序.成功启动后,我正在读取TShellExecuteInfo.hProcess以获取已启动进程的句柄.我想定期检查我的应用程序启动的进程是否仍在运行.两个或多个具有相同名称的进程可以同时运行,我想确保我的应用程序正在检查正确的进程.我希望能够在从Windows2000到Windows上的Windows系统上执行此操作.我知道有WinAPI函数G

  10. winapi – Win32:写入文件不缓冲?

    我错过了什么吗?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部