Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: не могу правильно прочесть ключ реестра  (Прочитано 14522 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mr.Gluck
Гость
« : 09-07-2004 09:39 » 

Так читаю:
DWORD type = REG_SZ;
DWORD buflen = 256;
BYTE buffer[64];
   RegQueryValueEx( hKey, "Gluck", NULL, &type, buffer, &buflen );
   RegCloseKey( hKey );

   MessageBox( NULL, (LPSTR)buffer,"!!!", MB_OK ); - пусто



Сам ключ создается так:
 RegSetValueEx (hKey, "Gluck", 0, REG_SZ,  (BYTE *)dest, sizeof(dest));
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 09-07-2004 10:31 » 

Mr.Gluck, что у тебя в dest при установке значения?

Что возвращают RegSetValueEx и RegQueryValueEx?

Для отладки пользуйся RegEdit'ом.  Создай значение в редакторе и прочти его из программы, создай значение из программы и посмотри на него в редакторе.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Mr.Gluck
Гость
« Ответ #2 : 09-07-2004 13:04 » 

Если создать DWORD в реестре, то читает и в мессаги че-то показывает.
RegSetValueEx возвращает, что все ОК, т.к. сам ключ в реестре создается.
А вот RegQueryValueEx че-то не то возвращает - 234 возвращает.
 
  HKEY  hSetupKey;
    DWORD Error;
    LONG l;
    char szBuff_Inst[255];

   LONG lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
                                0, KEY_READ, &hKey );
    if( ERROR_SUCCESS != lResult ) ;

   DWORD type = REG_SZ;
   DWORD buflen = 256;
   BYTE buffer[64];
    lResult=RegQueryValueEx( hKey, "Gluck", NULL, &type, buffer, &buflen );
     if( ERROR_SUCCESS != lResult ) MessageBox( NULL, "Trabl","!!!", MB_OK );;
char szBuf7[512];  
wsprintf( (LPSTR)szBuf7, "%d", lResult );
MessageBox( NULL, szBuf7,"!!!", MB_OK );
    RegCloseKey( hKey );
   
   MessageBox( NULL, (LPSTR)buffer,"FUCK!!!", MB_OK );
char buf1[0x100];
UINT uSize = 4096;
char szBuf_Dir[4096];
GetWindowsDirectory(szBuf_Dir, uSize);
char   dest[1024];
sprintf (dest, "%s\\%s", szBuf_Dir, "gluck.exe");
MessageBox( NULL, dest,"FUCK!!!", MB_OK );
   if( szBuff_Inst == dest) MessageBox( NULL, dest,"FUCK!!!", MB_OK ) ;
   else
   {
 //RegCreateKeyEx (HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run", NULL, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL);
 RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
                                0, KEY_WRITE, &hKey );
 RegSetValueEx (hKey, "Gluck", 0, REG_SZ,  (BYTE *)dest, sizeof(dest));
 RegCloseKey( hKey );
Записан
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 09-07-2004 15:58 » 

Mr.Gluck
Попробуй воспользоваться FormatMessage для отображения ошибки в более понятном виде
Записан
Mr.Gluck
Гость
« Ответ #4 : 09-07-2004 17:54 » 

Совсем туплю, сделал так :

DWORD type = REG_SZ;
   DWORD buflen = 256;
   BYTE buffer[64];
    lResult=RegQueryValueEx( hKey, "Gluck", NULL, &type, buffer, &buflen );
     if( ERROR_SUCCESS != lResult ) MessageBox( NULL, "Trabl","!!!", MB_OK );;

    LPVOID lpMsgBuf;

   FormatMessage(
      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
      NULL,
      GetLastError(),
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
      (LPTSTR) &lpMsgBuf,
      0,
      NULL
   );

   // Display the string.
   MessageBox( NULL, (LPCSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );

   // Free the buffer.
   LocalFree( lpMsgBuf );

   
     RegCloseKey( hKey );
   
MessageBox( NULL, (LPSTR)buffer,"FUCK!!!", MB_OK );

терерь выдает первую мессагу с названием Trabl, потом пишет, что операция выполнена удачно, а потом опять пусто, т.е. buffer пуст.
Записан
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 10-07-2004 10:44 » 

Естественно - у тебя же GetLastError() возвращает уже результат выполения MessageBox( NULL, "Trabl","!!!", MB_OK );
надо так (объявления переменных опускаю):
Код:
lResult=RegQueryValueEx( hKey, "Gluck", NULL, &type, buffer, &buflen ); 
if(ERROR_SUCCESS != lResult) {
  Res=GetLastError(); // Получаем ошибку
  MessageBox( NULL, "Trabl","!!!", MB_OK );
}
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
Res, // подставляем полученный результат
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
« Последнее редактирование: 29-11-2007 21:47 от Алексей1153++ » Записан
Mr.Gluck
Гость
« Ответ #6 : 10-07-2004 15:14 » 

lResult=RegQueryValueEx( hKey, "Gluck", NULL, &type, buffer, &buflen );

   if(ERROR_SUCCESS != lResult) {
  Res=GetLastError(); // Получаем ошибку
  MessageBox( NULL, "Trabl","!!!", MB_OK );
}
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
Res, // подставляем полученный результат
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);

   // Display the string.
MessageBox( NULL, (LPCSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );

Пишет, что все ОК. Я ж грю, что если создать ключ дворд, то что-то читает. кстати, мой ключ имеет троеточие в конце, это из-за болььшого буффера ?
Записан
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 10-07-2004 15:53 » 

Тьфу - ошибся, понадеался на память. Хелп надо было прочитать Улыбаюсь
If the function fails, the return value is a nonzero error code defined in WINERROR.H.
т.е. имеем:
Код:
lResult=RegQueryValueEx( hKey, "Gluck", NULL, &type, buffer, &buflen ); 
if(ERROR_SUCCESS != lResult) {
MessageBox( NULL, "Trabl","!!!", MB_OK );
}
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL,
lResult, // подставляем полученный результат
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf, 0, NULL);
Какое троеточие в конце?
ты размер буфера верно в процедуру передаешь?
« Последнее редактирование: 29-11-2007 21:48 от Алексей1153++ » Записан
Mr.Gluck
Гость
« Ответ #8 : 10-07-2004 16:28 » 

во прикол!!!!!!!!!!!!!!!!!!!!!!!!!!!
я по своей неосмотрительности написал два раза подряд

 lResult=RegQueryValueEx( hKey, "Gluck", NULL, &type, buffer, &buflen );
 lResult=RegQueryValueEx( hKey, "Gluck", NULL, &type, buffer, &buflen );

и оно написало, что все ОК и показало значение ключа. Я убрал одну строку - в ошибке написало More data is avaible и конечно Trabl напечатался. Я фигею.

Про солздание ключа смотри вверху - там 3ий пост.
Записан
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 10-07-2004 17:04 » 

Все верно оно тебе написало:
buflen - это передаваемое и возвращаемое значение.
Ты видимо его не инициализировал, вот первый раз оно тебе и ругнулось, что 0 байт в буфере ему не достаточно и выставило эту самую buflen в нужное значение. По правильному - после этого ты должен был бы GetMem`ом выделить нужный кусок памяти и вызвать функцию еще раз.

Про создание - похоже ты действительно передаешь слишком большое значение buflen:
sizeof(dest) скорее всего дает 1024 (char dest[1024]Ага
попробуй вместо этого подставить strlen(dest)+1
Записан
Mr.Gluck
Гость
« Ответ #10 : 10-07-2004 18:14 » 

ясно,  щаз без троеточия и строка один раз написана ))
надеюсь, все будет ОК
Спасибо.
Записан
Anonymous
Гость
« Ответ #11 : 23-07-2004 03:47 » new

А вот ещё вопрос на эту же тему.
Я тут первый раз работал с реестром, запись проходила хорошо, почти (спасибо Kivals за идею насчёт длины буфера - у меня тоже три точки в конце появлялись).
А вот чтобы прочитать я как-то промахнулся с функцией:
void GetConfig(char *szSource, char *szDest){
 #define MAX_VALUE_NAME 16383
 DWORD  Data;
 CHAR  achValue[MAX_VALUE_NAME];
    DWORD cchValue=MAX_VALUE_NAME;
 HKEY hkSub=NULL;
 if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SoftWare\\SSNSoft\\FileCopy", 0, "", 0,
   KEY_READ, NULL, &hkSub, NULL)==ERROR_SUCCESS){
  *achValue=0;
  cchValue=MAX_VALUE_NAME;
  RegEnumValue(hkSub, 0, achValue, &cchValue, NULL, NULL, (LPBYTE)szSource, &Data);
  *achValue=0;
  cchValue=MAX_VALUE_NAME;
  RegEnumValue(hkSub, 1, achValue, &cchValue, NULL, NULL, (LPBYTE)szDest, &Data);
  RegCloseKey(hkSub);
  }
    return;
}
использовал RegEnumValue.
Эффект своеобразный. Пока я в Debug работал - всё ОК. Решил как-то Release
попробовать. Ага... Читает только один параметр. Попробовал на других компутерах. Там разные варианты что читает, что нет, причём и Debug и Release версии. Кто знает - в чём дело? Просто любопытство... (функцию уже всё-равно переделал)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines