Windows - статьи




Программирование для системного реестра на С++ - часть 7


После того, как функция вернет значение, эта переменная будет содержать размер данных, скопированных в буфер. Если данные носят текстовый характер (REG_xxx_SZ), то также включается и нулевой символ (нулевые символы для REG_MULTI_SZ). Если размер буфера, недостаточен для сохранения данных, то функция вернет ERROR_MORE_DATA и сохранит требуемый размер буфера в переменную, на которую указывает этот параметр. Если lpData - NULL, а параметр lpcbData не нулевой, функция возвращает ERROR_SUCCESS и сохраняет размер данных в переменной, на которую указывает lpcbData.

Если функция выполнена успешно, возвращается ERROR_SUCCESS, в противном случае возвращается ненулевой код ошибки, определенный в Winerror.h

Как видим, функция RegQueryValueEx предоставляет возможность программисту вначале проверить, каков размер данных в параметре, а затем уже его считать. Это позволяет выделять память динамически, по ходу выполнения программы. Например, можно написать следующий код, считывающий данные параметра, если они текстовые и выводит их на экран.

HKEY h; PBYTE pbBuff; DWORD cBuff=0; DWORD Type=0; //Откроем раздел if(RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("asd"),0, KEY_QUERY_VALUE,&h)==ERROR_SUCCESS) { //Определим объем считываемых данных if(RegQueryValueEx(h,TEXT("set"),NULL,NULL,NULL, &cBuff)==ERROR_SUCCESS) { if(cBuff>1) { if((pbBuff=new BYTE [cBuff])==NULL) abort(); //Считываем информацию из параметра RegQueryValueEx(h,TEXT("set"),NULL,&Type,pbBuff,&cBuff); register int i; PBYTE tmpBuff; if((tmpBuff=new BYTE [cBuff])==NULL) abort(); switch(Type) { case(REG_SZ): cout<<"Type of REG_SZ, data: "<<pbBuff; break; case(REG_MULTI_SZ): cout<<"Type of REG_MULTI_SZ, data:\n\t"; for(i=0;i<cBuff-1;i++) pbBuff[i] ? cout<<pbBuff[i] : cout<<'\n'<<'\t'; break; case(REG_EXPAND_SZ): cout<<"Type of REG_EXPAND_SZ, data: "<<pbBuff<<endl; if(ExpandEnvironmentStrings((PCHAR)pbBuff, (PCHAR)tmpBuff,cBuff)!=0) cout<<tmpBuff; break; }




Содержание  Назад  Вперед