在 32 位和 64 位平台上句柄总是 32 位吗?
Is handle always 32bit on both 32bit and 64bit platforms?
我需要获取Excel2016 64bit的句柄
但是Application.Hwnd
returns一个long,而且没有Application.HwndPtr
.
靠谱吗?
如果可靠,为什么 Microsoft 添加 Application.HInstancePtr
而不是在 64 位平台上使用旧的 Application.HInstance
?
window 句柄是否可以大于 32 位?
没关系,OS 确保 window 句柄永远不会溢出 32 位值。桌面上的数字永远不会超过 65535 windows,所以这很容易做到。您可以在远程 window 句柄的 COM 互操作声明中看到它以这种方式工作,在 WTypes.idl SDK 文件中可见:
typedef union _RemotableHandle switch( long fContext ) u
{
case WDT_INPROC_CALL: long hInproc;
case WDT_REMOTE_CALL: long hRemote;
} RemotableHandle;
typedef [unique] RemotableHandle * wireHWND;
typedef [unique] RemotableHandle * wireHMENU;
// etc..
请注意进程外调用的 long
,一个 32 位值。
HINSTANCE 是一种非常不同的句柄,内核句柄,它在幕后肯定是 64 位值。等于模块内存中的基地址,所以他们被迫添加这个 属性.
我需要获取Excel2016 64bit的句柄
但是Application.Hwnd
returns一个long,而且没有Application.HwndPtr
.
靠谱吗?
如果可靠,为什么 Microsoft 添加 Application.HInstancePtr
而不是在 64 位平台上使用旧的 Application.HInstance
?
window 句柄是否可以大于 32 位?
没关系,OS 确保 window 句柄永远不会溢出 32 位值。桌面上的数字永远不会超过 65535 windows,所以这很容易做到。您可以在远程 window 句柄的 COM 互操作声明中看到它以这种方式工作,在 WTypes.idl SDK 文件中可见:
typedef union _RemotableHandle switch( long fContext ) u
{
case WDT_INPROC_CALL: long hInproc;
case WDT_REMOTE_CALL: long hRemote;
} RemotableHandle;
typedef [unique] RemotableHandle * wireHWND;
typedef [unique] RemotableHandle * wireHMENU;
// etc..
请注意进程外调用的 long
,一个 32 位值。
HINSTANCE 是一种非常不同的句柄,内核句柄,它在幕后肯定是 64 位值。等于模块内存中的基地址,所以他们被迫添加这个 属性.