PDA

Просмотр полной версии : Узнать существует ли запись в реестре


_nic
02.06.2007, 22:54
Проблема моя сотоит в том что вот этот код не работает

#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.Где я мог допустить ляп?

KEZ
02.06.2007, 23:06
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 нулю равен

da_ff
03.06.2007, 00:57
а ты проверь прежде указатель на ключ получен или нет
замени Key_execute на Key_all_access

inSa(Ne)rd
03.06.2007, 02:02
и указывай Reg_sz как тип данных если читается строка

_Great_
03.06.2007, 13:49
В Msdn примеры были вроде же. И там есть описание каждого параметра

_nic
03.06.2007, 13:52
Переписал вот так

#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();
}
}
Непомогло.Может кто нибудь даст ссылку на рабочий пример?

tclover
03.06.2007, 14:48
RegQueryValueEx(hKey,"mt",NULL,(LPDWORD)ktp,(LPBYTE)szProductType,&dwBufLen)

Xserg
03.06.2007, 15:07
У меня работает
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;

_Great_
03.06.2007, 15:18
,(LPDWORD)ktp
о, да! =\

DWORD dwValueType = REG_SZ;
RegQueryValueExA( ... &dwValueType... )

KEZ
03.06.2007, 15:39
char ktp[]="REG_SZ";

я, б*я, говорил что надо указать константу REG_SZ а не указатель на строку "REG_SZ"
эх вы молодежь, все это от нечитания msdn.

_nic
04.06.2007, 18:59
Мистика какая то в одном случае работает http://img181.imageshack.us/img181/9531/tk2qb5.jpg .В другом случае неработает хоть запись с нужным именем в разделе реестра присутствует http://img181.imageshack.us/img181/4186/tk1sz5.jpg

Xserg
04.06.2007, 21:23
Никакой мистики
Сравни мой пример и свой 132!=32

_nic
07.06.2007, 20:09
Никакой мистики
Сравни мой пример и свой 132!=32
Действительно просто содержимое в буфере не помещалось :)
PS:у меня возник ещё один вопрос как прочитать значение отличающиеся от REG_SZ к примеру REG_DWORD.Какими для этого должны быть pData, lpcbData.Если я делаю так (LPBYTE)&szProductType когда szProductType типа DWORD то получаю ошибку о том что нельзя преобразовать unsigned long в unsigned long* .Может кто нибудь привести заведомо рабочий пример отличный от того что на мсдн?