将注册表项HANDLE转换为HKEY

时间:2014-09-09 16:29:02

标签: c++ winapi

我正在使用混合注册表项功能环境(导出的ntdlladvapi32)。
我遇到的问题是,ntdll使用HANDLE类型作为键句柄,而advapi32使用HKEY使用HANDLE。 我无法弄清楚在C ++中将HKEY转换为{{1}}并继续接收编译器错误的语法。

2 个答案:

答案 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)

HANDLEHKEY都代表不透明的值。

“转换”HANDLEHKEY,只需使用正确的类型转换,例如 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);
}