我想製作一個程序,它從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