句柄是什么底层类型,特别是 HWND 窗口句柄?

问题描述 投票:0回答:1

我有这段代码,可以获取活动窗口的句柄并将该窗口设置为保留在其他窗口之上或将其重置为正常。

HWND hand = GetActiveWindow();

if (!hand)
{
    return FALSE;
}
 
SetWindowPos(hand, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
// OR
SetWindowPos(hand, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

我需要从另一种语言(特别是 LabVIEW)调用这些函数,而不是使用 C++ 代码。在 LabVIEW 中,我在

GetActiveWindow()
中调用
User32.dll
函数。我需要告诉LabVIEW输入和返回参数的类型是什么,但LabVIEW没有“
HWND
”类型的概念。唯一允许的类型是:

Signed 8-bit Integer
Signed 16-bit Integer
Signed 32-bit Integer
Signed 64-bit Integer
Signed Pointer-sized Integer
Unsigned 8-bit Integer
Unsigned 16-bit Integer
Unsigned 32-bit Integer
Unsigned 64-bit Integer
Unsigned Pointer-sized Integer
4-byte Single
8-byte Double

哪种是正确的类型以及确定它的过程是什么,包括更广泛的背景

我使用的是 32 位版本的 LabVIEW。有 64 位版本。如果这很重要,我可以有条件地编译不同的代码。

一方面,我觉得答案是

Pointer-sized Integer
,即使我在函数调用之间不一致,有符号或无符号并不重要。但句柄与指针并不完全相同,因此另一方面,答案可能是有符号或无符号的 32 位整数。如果我切换到 64 位 LabVIEW 版本,是否需要调用 64 位版本的 DLL 并切换到 64 位整数?

c++ winapi dll labview handle
1个回答
0
投票

TLDR:在 LabView 中将其声明为

void*

形式上,你可以在 Windows SDK 中看到它是这样声明的:

DECLARE_HANDLE            (HWND);

并且

DECLARE_HANDLE
宏扩展为:

#define DECLARE_HANDLE(name) 结构名称##{int 未使用;}; typedef 结构名称## *名称

所以

DECLARE_HANDLE(HWND)
正式扩展为:

struct HWND__{
    int unused;
}; 
typedef struct HWND__ *HWND;

所以 HWND 只是一个指向虚拟结构的指针。但它真正指向的是完全不同的东西。它可能实际上是 Windows 中哈希表的整数键。

就与其他编程语言的互操作而言,您应该将 HWND 视为

void*
。 LabView 只需知道它是一个不透明指针即可为参数调用生成正确的大小并在堆栈中返回值。

© www.soinside.com 2019 - 2024. All rights reserved.