Просмотр полной версии : Узнать существует ли запись в реестре
Проблема моя сотоит в том что вот этот код не работает
#include <windows.h>
#include <stdio.h>
#include <conio.h>
main()
{
HKEY hKey;char szProductType[32]; DWORD dwBufLen=32;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_EXECUTE,&hKey);
if(RegQueryValueEx(hKey,"test",NULL,NULL,szProductType,&dwBufLen) != ERROR_SUCCESS)
{
printf("no k \n");
getch();
}
}
RegQueryValueEx даже если есть запись с нужным именем невозращает ERROR_SUCCESS.Где я мог допустить ляп?
LONG RegQueryValueEx(
HKEY hKey, // handle of key to query
LPTSTR lpValueName, // address of name of value to query
LPDWORD lpReserved, // reserved
LPDWORD lpType, // address of buffer for value type
LPBYTE lpData, // address of data buffer
LPDWORD lpcbData // address of data buffer size
);
у тебя LPDWORD lpType нулю равен
а ты проверь прежде указатель на ключ получен или нет
замени Key_execute на Key_all_access
inSa(Ne)rd
03.06.2007, 02:02
и указывай Reg_sz как тип данных если читается строка
В Msdn примеры были вроде же. И там есть описание каждого параметра
Переписал вот так
#include <windows.h>
#include <stdio.h>
#include <conio.h>
main()
{
HKEY hKey;char szProductType[32]; DWORD dwBufLen=32;char ktp[]="REG_SZ";
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hKey);
if(RegQueryValueEx(hKey,"mt",NULL,(LPDWORD)ktp,szProductType,&dwBufLen) != ERROR_SUCCESS)
{
printf("no k \n");
getch();
}
}
Непомогло.Может кто нибудь даст ссылку на рабочий пример?
RegQueryValueEx(hKey,"mt",NULL,(LPDWORD)ktp,(LPBYTE)szProductType,&dwBufLen)
У меня работает
HKEY Key;
char szProductType[132];
DWORD dwBufLen=132;
DWORD ktp =REG_SZ; // так работает
RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&Key);
if(RegQueryValueExA(Key,"kav",NULL,&ktp,(LPBYTE)szProductType,&dwBufLen) != ERROR_SUCCESS)
{printf("no k \n");} else {printf(szProductType);}
getch();
return 0;
,(LPDWORD)ktp
о, да! =\
DWORD dwValueType = REG_SZ;
RegQueryValueExA( ... &dwValueType... )
char ktp[]="REG_SZ";
я, б*я, говорил что надо указать константу REG_SZ а не указатель на строку "REG_SZ"
эх вы молодежь, все это от нечитания msdn.
Мистика какая то в одном случае работает http://img181.imageshack.us/img181/9531/tk2qb5.jpg .В другом случае неработает хоть запись с нужным именем в разделе реестра присутствует http://img181.imageshack.us/img181/4186/tk1sz5.jpg
Никакой мистики
Сравни мой пример и свой 132!=32
Никакой мистики
Сравни мой пример и свой 132!=32
Действительно просто содержимое в буфере не помещалось :)
PS:у меня возник ещё один вопрос как прочитать значение отличающиеся от REG_SZ к примеру REG_DWORD.Какими для этого должны быть pData, lpcbData.Если я делаю так (LPBYTE)&szProductType когда szProductType типа DWORD то получаю ошибку о том что нельзя преобразовать unsigned long в unsigned long* .Может кто нибудь привести заведомо рабочий пример отличный от того что на мсдн?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot