我想制作一个程序,它从Windows注册表中收集一些信息,然后将其保存到文件中。但是,我收集信息遇到问题。我想在一个结构中存储一个数组。我的问题是在初始化结构之后指定数组的大小。内存分配(键值)对结构,并从注册表中读取
typedef struct RESULTSKEY{
char *ResultsKeys;
char *ResultsValues;
} RESULTSKEYS;
RESULTSKEYS RES_OS_Keys[] =
{
{ _T("ProductName"),_T(" ")},
{ _T("CSDVersion"),_T(" ") },
{ _T("BuildLab"),_T(" ") },
{ _T("SystemRoot"),_T(" ") },
};
然后用下面的函数发生魔法。
for (l=0; l< _countof(RES_OS_Keys);l++)
{
variable = (char*)ReadRegistry((LPTSTR) clave,(LPTSTR)RES_OS_Keys[l].ResultsKeys);
RES_OS_Keys[l].ResultsValues = variable;
}
但当然,还有一个问题:RES_OS_Keys[l].ResultsValues
具有相同的价值观:
RES_OS_Keys[0]
{ ResultsKeys=0x00420894"ProductName" Resultsvalues=0x0012f488 "C:\WINDOWS"}
RES_OS_Keys[1]
{ ResultsKeys=0x00420880"CSDVersion" Resultsvalues=0x0012f488 "C:\WINDOWS"}
RES_OS_Keys[2]
{ ResultsKeys=0x00420874"ProductName" Resultsvalues=0x0012f488 "C:\WINDOWS"}
RES_OS_Keys[3]
{ ResultsKeys=0x00420864"ProductName" Resultsvalues=0x0012f488 "C:\WINDOWS"}
从来就注意到了,它写在相同的内存段。这就是为什么我想到这个问题,问题是结构中变量的内存分配问题。我一直在寻找方法,但是我感到困惑。所以,如果有人能给我一个建议,我会很感激。
这里是ReadRegistry
功能:
unsigned char *ReadRegistry(LPTSTR clave, LPTSTR valor)
{
unsigned char* buffer =new unsigned char[1024];
unsigned char infoValue [1024];
unsigned char infocadena [1024];
HKEY hKey;
LONG lStatus;
DWORD dwType=REG_SZ;
DWORD dwSize=1023;
int i=0;
int j=0;
lStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,clave,0,KEY_READ|KEY_WOW64_64KEY,&hKey);
if (lStatus == ERROR_SUCCESS)
{
lStatus = RegQueryValueEx(hKey,(LPCTSTR)valor, 0,&dwType, (LPBYTE)&infoValue, &dwSize);
if (lStatus == ERROR_SUCCESS)
{
for(i=0;infoValue[i]!=0 && infoValue[i]!=204;i++)
infocadena[i]=(char)infoValue[i];
infocadena [i]='\0';
buffer = infocadena;
RegCloseKey(hKey);
return buffer;
delete[] buffer;
}
}
RegCloseKey(hKey);
cout << "error by reading registry";
delete[] buffer;
return 0;
}
,如果你用C++写的,使用'的std :: vector's和'的std :: string's会更容易些。 – juanchopanza 2013-04-30 13:52:19
很难确定(特别是因为您没有发布'ReadRegistry'的代码),但我会说您不知道如何在C++中进行动态内存分配,甚至不知道指针如何工作。可能你只需要花一些时间阅读一本C++书籍。有很多方法可以解决这个问题,但最重要的是让你更好地理解问题。 – john 2013-04-30 13:56:50
最有可能的是,您的ReadRegistry函数正在从注册表中读取一个静态缓冲区,并返回指向该静态缓冲区的指针。你正在保存的是哪个。但是你每次都得到相同的指针。 – TazMainiac 2013-04-30 13:58:35