Excel 的 Application.Hwnd 属性 可以从 64 位 VBA 开始使用吗?
Is Excel's Application.Hwnd property usable from 64 bit VBA?
我需要从电子表格中的 64 位 VBA 代码 运行 获取 Excel 2013 x64 window 句柄。有几个选项可以做到这一点:
- 阅读
Application.Hwnd
(MSDN Application.Hwnd Property (Excel))
- 调用从 user32 导入的 FindWindow,例如如此处接受的答案中所述:What are the differences between VBA 6.0 and VBA 7.0?:
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
问题是 Application.Hwnd
returns 一个 Long
,即 32 位(我已经在 64 位环境中用 MsgBox TypeName(Application.Hwnd)
验证了这一点),而 FindWindow
returns a LongPtr
,在 Office x64 中是 64 位长。
这是否意味着不能相信 Application.Hwnd
属性 在 64 位环境中总是正确的?
Does this mean that the Application.Hwnd
property can't be trusted to always be correct in a 64 bit environment?
不,那不是真的。 LongPtr
只是一种可变数据类型,它在 32 位版本上是 4 字节数据类型,在 64 位版本的 Office 2010 上是 8 字节数据类型。
您可以阅读更多关于 LongPtr
Here
万一上面的link死了...
LongPtr
(Long integer on 32-bit systems, LongLong integer on 64-bit systems)变量存储为带符号的 32 位(4 字节) 在 32 位系统上数值范围从 -2,147,483,648 to 2,147,483,647
开始的数字;和带符号的 64 位(8 字节)数字,在 64 位系统上的值范围为 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
。
备注
LongPtr
不是真正的数据类型,因为它在 32 位环境中转换为 Long,在 64 位环境中转换为 LongLong
。使用 LongPtr
可以编写 可移植代码 ,可以在 32 位和 64 位环境中 运行。使用 LongPtr
作为指针和句柄。
建议进一步阅读:
Compatibility Between the 32-bit and 64-bit Versions of Office 2010
Followup from comments
However, I'm worried that since FindWindow can return a larger value, a window handle may exceed 32 bits at some stage. And if that's true, then Application.Hwnd would be unable to return the correct value. Or are you saying that a window handle will never exceed 32 bits?
下面link解释得很漂亮。
Interprocess Communication Between 32-bit and 64-bit Applications
我需要从电子表格中的 64 位 VBA 代码 运行 获取 Excel 2013 x64 window 句柄。有几个选项可以做到这一点:
- 阅读
Application.Hwnd
(MSDN Application.Hwnd Property (Excel)) - 调用从 user32 导入的 FindWindow,例如如此处接受的答案中所述:What are the differences between VBA 6.0 and VBA 7.0?:
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As LongPtr
问题是 Application.Hwnd
returns 一个 Long
,即 32 位(我已经在 64 位环境中用 MsgBox TypeName(Application.Hwnd)
验证了这一点),而 FindWindow
returns a LongPtr
,在 Office x64 中是 64 位长。
这是否意味着不能相信 Application.Hwnd
属性 在 64 位环境中总是正确的?
Does this mean that the
Application.Hwnd
property can't be trusted to always be correct in a 64 bit environment?
不,那不是真的。 LongPtr
只是一种可变数据类型,它在 32 位版本上是 4 字节数据类型,在 64 位版本的 Office 2010 上是 8 字节数据类型。
您可以阅读更多关于 LongPtr
Here
万一上面的link死了...
LongPtr
(Long integer on 32-bit systems, LongLong integer on 64-bit systems)变量存储为带符号的 32 位(4 字节) 在 32 位系统上数值范围从 -2,147,483,648 to 2,147,483,647
开始的数字;和带符号的 64 位(8 字节)数字,在 64 位系统上的值范围为 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
。
备注
LongPtr
不是真正的数据类型,因为它在 32 位环境中转换为 Long,在 64 位环境中转换为 LongLong
。使用 LongPtr
可以编写 可移植代码 ,可以在 32 位和 64 位环境中 运行。使用 LongPtr
作为指针和句柄。
建议进一步阅读:
Compatibility Between the 32-bit and 64-bit Versions of Office 2010
Followup from comments
However, I'm worried that since FindWindow can return a larger value, a window handle may exceed 32 bits at some stage. And if that's true, then Application.Hwnd would be unable to return the correct value. Or are you saying that a window handle will never exceed 32 bits?
下面link解释得很漂亮。 Interprocess Communication Between 32-bit and 64-bit Applications