我使用的是一个混合的注册表项功能环境(包括ntdll和advapi32导出的功能)。
我面临的问题是ntdll使用类型HANDLE作为键句柄,而advapi32使用HKEY。我找不到在C++中将HANDLE转换为HKEY的语法,并且不断收到编译器错误。
发布于 2014-09-10 00:33:37
没有要转换的内容。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
#endifwindef.h:
DECLARE_HANDLE(HKEY);如果你遇到编译器错误,你可能已经定义了STRICT,这是为了防止API混合句柄类型。定义STRICT后,HKEY将映射到struct HKEY__*。如果未定义STRICT,HKEY将改为映射到HANDLE。
既然您知道NTDLL的注册表HANDLE和ADVAPI32的HKEY代表的是同一件事,那么就按原样使用它们,在两个注册表API之间传递句柄时消除类型转换编译器错误。
发布于 2014-09-10 00:51:34
HANDLE和HKEY都表示某种不透明的值。
要从HANDLE“转换”到HKEY,只需使用像static_cast<>,这样的适当类型转换,例如:
#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);
}https://stackoverflow.com/questions/25749711
复制相似问题