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
|
|
« Ответ #1 : 09-07-2004 10:31 » |
|
Mr.Gluck, что у тебя в dest при установке значения?
Что возвращают RegSetValueEx и RegQueryValueEx?
Для отладки пользуйся RegEdit'ом. Создай значение в редакторе и прочти его из программы, создай значение из программы и посмотри на него в редакторе.
|
|
|
Записан
|
|
|
|
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
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #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 » |
|
А вот ещё вопрос на эту же тему. Я тут первый раз работал с реестром, запись проходила хорошо, почти (спасибо 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 версии. Кто знает - в чём дело? Просто любопытство... (функцию уже всё-равно переделал)
|
|
|
Записан
|
|
|
|
|