Winapi 在vc+中创建新的注册表项+;

Winapi 在vc+中创建新的注册表项+;,winapi,visual-c++,Winapi,Visual C++,我正在尝试创建新的注册表项,以复制HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet设置中的某些注册表值。我成功地创建了新的注册表项,但没有复制值和子项。我无法找出我在哪里犯了错误。请帮助我。下面是我的代码: #include<tchar.h> #include<conio.h> #include<Windows.h> #include<Winreg.h> #in

我正在尝试创建新的注册表项,以复制HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet设置中的某些注册表值。我成功地创建了新的注册表项,但没有复制值和子项。我无法找出我在哪里犯了错误。请帮助我。下面是我的代码:

#include<tchar.h>
#include<conio.h>
#include<Windows.h>
#include<Winreg.h>
#include<WinBase.h >
#include<TlHelp32.h>
#define MAX_PATH 1024
DWORD MigrateProxy;
DWORD ProxyEnable;
DWORD ProxyHTTP11;
LPWSTR AutoConfigURL=0;
LPWSTR ProxyServer=0;
LPWSTR ProxyOverride=0;
void CopyRegistryProxySettings(HKEY hKeyRoot, LPCWSTR Subkey, LPCWSTR ValueKey);
bool CreateNewRegistry(HKEY hKeyRoot);


void main()
{
bool bStatusFlag = false,bReadFlag=false,bWriteFlag=false;
LPCWSTR lpSubKey =  L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
LPCWSTR lpValueName = L"AutoConfigURL";
CopyRegistryProxySettings(HKEY_CURRENT_USER, lpSubKey,lpValueName);
bStatusFlag = CreateNewRegistry(HKEY_CURRENT_USER);
//bWriteFlag = RestoreOlderRegistry()


getch();
}

void CopyRegistryProxySettings(HKEY hKeyRoot, LPCWSTR Subkey, LPCWSTR ValueKey)
{
HKEY hKey = NULL;
wchar_t buffer[MAX_PATH];
DWORD dwBufLen;
DWORD dwValue = 0;
DWORD dwDataSize = sizeof(DWORD);
memset(buffer, 0, sizeof buffer);
dwBufLen = MAX_PATH;

if ( ERROR_SUCCESS == RegOpenKeyEx(hKeyRoot, Subkey, 0, KEY_ALL_ACCESS , &hKey))
{

    if(ERROR_SUCCESS == RegQueryValueEx(hKey,L"AutoConfigURL",NULL,NULL,(BYTE*)buffer,&dwBufLen))
    {
        AutoConfigURL = buffer;
        memset(buffer, 0, sizeof buffer);

    }
    if(ERROR_SUCCESS == RegQueryValueEx(hKey,L"ProxyServer",NULL,NULL,(BYTE*)buffer,&dwBufLen))
    {
        ProxyServer = buffer;
        memset(buffer, 0, sizeof buffer);
    }
    if(ERROR_SUCCESS == RegQueryValueEx(hKey,L"ProxyOverride",NULL,NULL,(BYTE*)buffer,&dwBufLen))
    {
        ProxyOverride = buffer;
        memset(buffer, 0, sizeof buffer);
    }
    if(ERROR_SUCCESS == RegQueryValueEx(hKey,L"MigrateProxy",NULL,NULL,(LPBYTE)&dwValue,&dwDataSize))
    {
        MigrateProxy = dwValue;

    }
    if(ERROR_SUCCESS == RegQueryValueEx(hKey,L"ProxyEnable",NULL,NULL,(LPBYTE)&dwValue,&dwDataSize))
    {
        ProxyEnable = dwValue;

    }

    if(ERROR_SUCCESS == RegQueryValueEx(hKey,L"ProxyHttp1.1",NULL,NULL,(LPBYTE)&dwValue,&dwDataSize))
    {
        ProxyHTTP11 = dwValue;

    }


}

}

bool CreateNewRegistry(HKEY hKeyRoot)
{   
HKEY    hKey;
if (RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\NewSettings\\Internet Settings",  NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) == ERROR_SUCCESS)
{
 RegSetValueEx(hKey, L"AutoConfigURL", NULL,REG_SZ,(BYTE*)AutoConfigURL, (DWORD)((lstrlen(AutoConfigURL)+1)*sizeof(TCHAR)));
 RegSetValueEx(hKey, L"ProxyServer", NULL,REG_SZ,(BYTE*)ProxyServer, (DWORD)((lstrlen(ProxyServer)+1)*sizeof(TCHAR)));
 RegSetValueEx(hKey, L"ProxyOverride", NULL,REG_SZ,(BYTE*)ProxyOverride, (DWORD)((lstrlen(ProxyOverride)+1)*sizeof(TCHAR)));
 RegSetValueEx(hKey, L"MigrateProxy", NULL,REG_DWORD,(BYTE*)MigrateProxy, (DWORD)sizeof(MigrateProxy));
 RegSetValueEx(hKey, L"ProxyEnable", NULL,REG_DWORD,(BYTE*)ProxyEnable, (DWORD)sizeof(ProxyEnable));
 RegSetValueEx(hKey, L"ProxyHTTP1.1", NULL, REG_DWORD,(BYTE*)ProxyHTTP11, (DWORD)sizeof(ProxyHTTP11));

}

return 1;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义最大路径1024
德沃德·米格雷普洛西;
DWORD ProxyEnable;
DWORD ProxyHTTP11;
LPWSTR自动配置=0;
LPWSTR ProxyServer=0;
LPWSTR ProxyOverride=0;
作废CopyRegistryProxySettings(HKEY hKeyRoot、LPCWSTR子键、LPCWSTR ValueKey);
bool CreateNewRegistry(HKEY hKeyRoot);
void main()
{
bool bStatusFlag=false,bReadFlag=false,bWriteFlag=false;
LPCWSTR lpSubKey=L“软件\\Microsoft\\Windows\\CurrentVersion\\Internet设置”;
LPCWSTR lpValueName=L“自动配置”;
CopyRegistryProxySettings(HKEY_当前_用户、lpSubKey、lpValueName);
bStatusFlag=CreateNewRegistry(HKEY_当前用户);
//bWriteFlag=RestoreOrderRegistry()
getch();
}
无效CopyRegistryProxySettings(HKEY hKeyRoot、LPCWSTR子项、LPCWSTR ValueKey)
{
HKEY HKEY=NULL;
wchar_t缓冲区[最大路径];
德沃德·德布弗伦;
DWORD dwValue=0;
DWORD dwDataSize=sizeof(DWORD);
memset(buffer,0,sizeof buffer);
dwBufLen=最大路径;
if(ERROR_SUCCESS==RegOpenKeyEx(hKeyRoot、Subkey、0、KEY_ALL_ACCESS和hKey))
{
if(ERROR_SUCCESS==RegQueryValueEx(hKey,L“自动配置”,NULL,NULL,(字节*)缓冲区和dwBufLen))
{
自动配置=缓冲区;
memset(buffer,0,sizeof buffer);
}
if(ERROR_SUCCESS==regqueryvaluex(hKey,L“ProxyServer”、NULL、NULL、(字节*)缓冲区和dwBufLen))
{
ProxyServer=缓冲区;
memset(buffer,0,sizeof buffer);
}
if(ERROR_SUCCESS==regqueryvaluex(hKey,L“ProxyOverride”、NULL、NULL、(BYTE*)缓冲区和dwBufLen))
{
ProxyOverride=缓冲区;
memset(buffer,0,sizeof buffer);
}
if(ERROR_SUCCESS==RegQueryValueEx(hKey,L“MigrateProxy”,NULL,NULL,(LPBYTE)&dwValue,&dwDataSize))
{
MigrateProxy=dwValue;
}
if(ERROR_SUCCESS==RegQueryValueEx(hKey,L“ProxyEnable”,NULL,NULL,(LPBYTE)&dwValue,&dwDataSize))
{
ProxyEnable=dwValue;
}
if(ERROR_SUCCESS==regqueryvaluex(hKey,L“ProxyHttp1.1”,NULL,NULL,(LPBYTE)&dwValue,&dwDataSize))
{
ProxyHTTP11=dwValue;
}
}
}
bool CreateNewRegistry(HKEY hKeyRoot)
{   
HKEY HKEY;
如果(RegCreateKeyEx(HKEY_当前用户,L“软件\\新闻设置\\互联网设置”,NULL,REG_选项\u非易失性,KEY_所有访问,NULL,&HKEY,NULL)=错误\u成功)
{
RegSetValueEx(hKey,L“自动配置”,NULL,REG_SZ,(字节*)自动配置,(DWORD)((lstrlen(自动配置)+1)*sizeof(TCHAR));
RegSetValueEx(hKey,L“ProxyServer”,NULL,REG_SZ,(字节*)ProxyServer,(DWORD)((lstrlen(ProxyServer)+1)*sizeof(TCHAR));
RegSetValueEx(hKey,L“ProxyOverride”,NULL,REG_SZ,(字节*)ProxyOverride,(DWORD)((lstrlen(ProxyOverride)+1)*sizeof(TCHAR));
RegSetValueEx(hKey,L“MigrateProxy”,NULL,REG_DWORD,(字节*)MigrateProxy,(DWORD)sizeof(MigrateProxy));
RegSetValueEx(hKey,L“ProxyEnable”,NULL,REG_DWORD,(字节*)ProxyEnable,(DWORD)sizeof(ProxyEnable));
RegSetValueEx(hKey,L“ProxyHTTP1.1”,NULL,REG_DWORD,(字节*)ProxyHTTP11,(DWORD)sizeof(ProxyHTTP11));
}
返回1;
}

自动配置=缓冲区;memset(buffer,0,sizeof buffer)
使
自动配置
指向
缓冲区
已指向的同一内存块,然后将所述内存块归零。
RegQueryValueEx
读取的任何数据都会被清除。最后,您有
自动配置
代理服务器
代理覆盖
都彼此相等,并且都指向同一个零块。另外,在
RegSetValueEx
调用中,使其
(BYTE*)和MigrateProxy
(对于其他
REG\u DWORD
值也是如此;请注意符号)。令人惊讶的是,您的程序在这些调用中没有崩溃。@IgorTandetnik谢谢您提供的输入确实帮助了我纠正了REG\u SZ,但无法纠正REG\u DWORD。您说的“无法”是什么意思?什么阻止了你?非常感谢,问题已经解决了。我在以下行RegSetValueEx(hKey,L“MigrateProxy”,NULL,REG_DWORD(字节*)MigrateProxy,(DWORD)sizeof(MigrateProxy))中的CreateNewRegistry方法中丢失了&;