完美解决XP无法定位程序输入点RegGetValue于动态链接库ADVAPI32.dll,XP,win7注册表读取问题

来源:互联网 发布:php新闻发布系统登录 编辑:程序博客网 时间:2024/05/22 12:26
当C++程序调用REGGETVALUEW,并在XP运行时,出现无法定位程序输入点RegGetValue于动态链接库ADVAPI32.dll,这是由于XP版本中的动态链接库ADVAPI32.dll中别没有RegGetValue,微软官方的说明是:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724868(v=vs.85).aspx。为了代码能在XP,WIN7下都能完美运行,可以自己封装注册表的Read API,然后有关注册表读取都调用MyRegGetValueA ,就不用担心API是否存在已经XP,WIN7API版本不同的问题。本人尝试封装的API如下:

extern "C" LSTATUS MyRegGetValueA (HKEY hkey, LPCSTR lpSubKey, LPCSTR lpValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
{
typedef LSTATUS (WINAPI *REGGETVALUEA)(HKEY hkey, LPCSTR lpSubKey, LPCSTR lpValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData);
REGGETVALUEA LoadLibAddy;
LoadLibAddy = (REGGETVALUEA)GetProcAddress(GetModuleHandle(L"advapi32.dll"), "RegGetValueA");
DWORD type;


if (LoadLibAddy)
{
return LoadLibAddy(hkey, lpSubKey, lpValue, dwFlags, pdwType, pvData, pcbData);
}
else
{
if (dwFlags == RRF_RT_REG_SZ)
{
type = REG_SZ;
}
else if (dwFlags == RRF_RT_REG_DWORD)
{
type = REG_DWORD;
}
return RegQueryValueExA(hkey, lpValue, NULL, &type, (LPBYTE)pvData, pcbData);
}
}


extern "C" LSTATUS MyRegGetValueW (HKEY hkey, LPCWSTR lpSubKey, LPCWSTR lpValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
{
typedef LSTATUS (WINAPI *REGGETVALUEW)(HKEY hkey, LPCWSTR lpSubKey, LPCWSTR lpValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData);
REGGETVALUEW LoadLibAddy;
LoadLibAddy = (REGGETVALUEW)GetProcAddress(GetModuleHandle(L"advapi32.dll"), "RegGetValueW");
DWORD type;


if (LoadLibAddy)
{
return LoadLibAddy(hkey, lpSubKey, lpValue, dwFlags, pdwType, pvData, pcbData);
}
else
{
if (dwFlags == RRF_RT_REG_SZ)
{
type = REG_SZ;
}
else if (dwFlags == RRF_RT_REG_DWORD)
{
type = REG_DWORD;
}
return RegQueryValueExW(hkey, lpValue, NULL, &type, (LPBYTE)pvData, pcbData);
}
}
1 0