Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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
Windows RegDeleteKey和RegDeleteKeyEx_Windows_Winapi_Registry - Fatal编程技术网

Windows RegDeleteKey和RegDeleteKeyEx

Windows RegDeleteKey和RegDeleteKeyEx,windows,winapi,registry,Windows,Winapi,Registry,我正在编写一个应用程序,它将使用APIRegDeleteKey或RegDeleteKeyEx递归删除一些注册表项。困扰我的是RegDeleteKeyEx没有为小于XP x64 Professional的用户定义,所以现在这个限制限制限制了我的应用程序。是否有任何方法可以使用两种API,使其兼容XP x86和Win7 x64 为了让您的应用程序在不存在RegDeleteKeyEx的旧系统中运行,您需要避免静态链接到此API。也就是说,您不直接使用这个函数,而是通过GetProcAddress在运行

我正在编写一个应用程序,它将使用APIRegDeleteKeyRegDeleteKeyEx递归删除一些注册表项。困扰我的是RegDeleteKeyEx没有为小于XP x64 Professional的用户定义,所以现在这个限制限制限制了我的应用程序。是否有任何方法可以使用两种API,使其兼容XP x86和Win7 x64

为了让您的应用程序在不存在
RegDeleteKeyEx
的旧系统中运行,您需要避免静态链接到此API。也就是说,您不直接使用这个函数,而是通过
GetProcAddress
在运行时获取它的指针。如果成功,那么API可用,您可以使用它(或者您可以检查操作系统版本)

看看这里::


RegDeleteKey
可以直接使用,因为它存在于所有目标平台中。

为了让您的应用程序在不存在
RegDeleteKeyEx
的旧系统中运行,您需要避免静态链接到此API。也就是说,您不直接使用这个函数,而是通过
GetProcAddress
在运行时获取它的指针。如果成功,那么API可用,您可以使用它(或者您可以检查操作系统版本)

看看这里::


RegDeleteKey
可以直接使用,因为它存在于所有目标平台中。

谢谢你,mate,你给我省了很多麻烦:-)@RomanR:“或者你可以检查操作系统版本”-只有在编译时延迟加载函数(在运行时使用动态加载)时才有效@Remy Lebeau:在进入LoadModule/GetProcAddress之前,可能需要检查版本。如果需要同时定位多个函数,或者当函数存在但不执行预期的操作(仅存根)时,这是有意义的。你所说的当然也有效(延迟加载DLL和版本检查以避免调用实际丢失的函数)。谢谢你,伙计,你为我省了很多麻烦:-)@RomanR:“或者你可以检查操作系统版本”-只有在编译时延迟加载函数(在运行时使用动态加载)才有效@Remy Lebeau:在进入LoadModule/GetProcAddress之前,可能需要检查版本。如果需要同时定位多个函数,或者当函数存在但不执行预期的操作(仅存根)时,这是有意义的。当然,您所说的也有效(延迟加载DLL和版本检查以不调用实际缺少的函数)。
   hAdvAPI32 = LoadLibrary(_T("AdvAPI32.dll"));
   ASSERT(hAdvAPI32 != NULL);
   _RegDeleteKeyEx = (PFN_RegDeleteKeyEx)GetProcAddress(hAdvAPI32 , "RegDeleteKeyEx");
   ASSERT(_RegDeleteKeyEx != NULL);