Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将注册表项句柄转换为HKEY_C++_Winapi - Fatal编程技术网

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
,它是用户对象的句柄。