我正在使用混合注册表项功能环境(导出的ntdll
和advapi32
)。
我遇到的问题是,ntdll
使用HANDLE
类型作为键句柄,而advapi32
使用HKEY
使用HANDLE
。
我无法弄清楚在C ++中将HKEY
转换为{{1}}并继续接收编译器错误的语法。
答案 0 :(得分:0)
没有什么可以转换的。 HKEY
已经是HANDLE
。
WINNT.H:
#ifdef STRICT
typedef void *HANDLE;
#if 0 && (_MSC_VER > 1000)
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
#else
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#endif
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
WINDEF.H:
DECLARE_HANDLE(HKEY);
如果您遇到编译器错误,则可能已定义STRICT
,这是为了防止API混合句柄类型。定义STRICT
后,HKEY
会映射到struct HKEY__*
。如果未定义STRICT
,则HKEY
会映射到HANDLE
。
由于您知道NTDLL的注册表HANDLE
和ADVAPI32的HKEY
代表相同的事情,所以只需按原样使用它们,输入类型转换编译器错误时在两个注册表API之间传递句柄。
答案 1 :(得分:0)
HANDLE
和HKEY
都代表不透明的值。
要“转换”从HANDLE
到HKEY
,只需使用正确的类型转换,例如 static_cast<>
,例如:< / p>
#define STRICT
#include <Windows.h>
int main()
{
HANDLE h = nullptr;
HKEY hKey = nullptr;
// Use C++-style cast from HANDLE to HKEY:
hKey = static_cast<HKEY>(h);
}