C++ 将注册表项句柄转换为HKEY
我使用的是混合注册表项函数环境(包括C++ 将注册表项句柄转换为HKEY,c++,winapi,C++,Winapi,我使用的是混合注册表项函数环境(包括ntdll和advapi32导出的注册表项函数)。 我面临的问题是ntdll使用类型HANDLE作为键句柄,而advapi32使用HKEY。 在C++中,我不能找到一个将句柄>代码>转换为 HKEY 的语法,并不断地接收编译器错误。 < P>没有任何要转换的内容。HKEY已经是句柄 winnt.h: #ifdef STRICT typedef void *HANDLE; #if 0 && (_MSC_VER > 1000) #define
ntdll
和advapi32
导出的注册表项函数)。我面临的问题是
ntdll
使用类型HANDLE
作为键句柄,而advapi32
使用HKEY
。
在C++中,我不能找到一个将<代码>句柄>代码>转换为<代码> HKEY <代码>的语法,并不断地接收编译器错误。 < P>没有任何要转换的内容。
HKEY
已经是句柄
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
s和ADVAPI32的HKEY
s代表相同的东西,只需按原样使用它们,在两个注册表API之间传递句柄时键入casting编译器错误。这两个HANDLE
和HKEY
都代表某种不透明的值
要将句柄
转换为HKEY
,只需使用适当的类型转换,如静态转换
,例如:
#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);
}
#定义严格的
#包括
int main()
{
句柄h=空PTR;
HKEY HKEY=nullptr;
//使用从句柄到HKEY的C++样式转换:
hKey=静态铸件(h);
}
您尝试使用的函数有哪些示例?我不知道有两个注册表API。通常句柄是一种不透明类型,根本无法转换。它们可能不同,因为它们可能无法在两个API之间混合。你可以不使用强制转换,但我认为不尝试是最安全的。你不应该使用ntdll函数。只有winapi函数才能保证它们在Windows版本中保持稳定。如果密钥包含主应用程序设置的特定值,我试图保护它不被删除。我正在挂接NtDeleteKey函数,然后只需使用(ntdll)NtEnumerateValueKey或(advapi32)RegEnumValue用于检查我的受保护值是否属于密钥,以拒绝删除。对于这两个函数,我都收到了ACCESS_DENIED错误,我发现根据msdn,如果在同一个进程中执行“delete”或“rename”调用,则这两个函数都会被拒绝(这正是我的情况:-)。。。我现在正在探索可能完成这项工作的不同功能(如NtQueryMultipleValueKey),但文档和示例非常有限。。。非常感谢你的帮助!非常感谢你的支持。我真的很感激。谢谢你宝贵的帮助。我注意到你愿意在另一个网站上分享你在NtQueryValueKey案例中的经验:-)与此同时,我在另一个线程中描述了我案例的发展过程。无论在HKEY
案例中的情况多么真实,您不能依赖这种推理:DECLARE\u HANDLE
用于与“内核对象句柄”(HANDLE to a kernel object)(HANDLE
)无关的所有类型的句柄类型。例如:HWND
,它是用户对象的句柄。