Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2008, 16:39   #1
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию косяки с RegQueryValueEx

Насколько я понял, этой функцией на вин апи проверяют наличие параметра в реестре (читают), но огромное количество поинтеров мне не понятно, в итоге несмотря на то, что я вроде выполняю все правила вылетают ошибки с памятью, напишите как это правильно на вин апи сделать, плиз или киньте на действительно хорошую статью
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 01.04.2008, 19:34   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
LONG RegQueryValueEx(

HKEY hKey, // это понятно
LPTSTR lpValueName, // имя параметра
LPDWORD lpReserved, // reserved
LPDWORD lpType, // указатель на переменную в которую будет сохранёп тип параметра
LPBYTE lpData, // указатель на буфер куда будет сохранены данные которые хранит параметр
LPDWORD lpcbData // указатель на переменную в которой хранится размер буфера, и куда в последствии будет сохранён размер скопированных данных
);
в чём конкретно проблема?
rpy3uH вне форума Ответить с цитированием
Старый 02.04.2008, 14:21   #3
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Код:
program RegApi;

uses
  windows;

Var key:hkey; s,size:Pointer; ss:string; x:integer;
begin
 x:=0;
 new(s);
 new(size);
 x:=REG_SZ;
 If (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  'Software\Microsoft\Windows NT\CurrentVersion\Windows',
  0, KEY_CREATE_SUB_KEY or KEY_SET_VALUE, key) = 0)
    and
    (RegQueryValueEx(key,'AppInit_DLLs',nil,@x,s,size)=0)
    and (s<>nil) then
    begin
     ss:=string(PChar(s));
     x:=pos('шняга всякая',ss);
     If (x>0) then
      begin
       delete(ss,x,length(ss)-x+1);
       s:=PChar(ss);
       RegSetValueEx(key,'AppInit_DLLs',0,REG_SZ,s,sizeof(s^));
      end;
    end;
 dispose(s);
 dispose(size);
end.
просто не видит параметров в реестре, либо не заходит, либо возвращает нулевой указатель,
я думаю можно информацию о типе данных не обязательно отправлять,
пробовал просто интерпретировать значение по данному адресу как PChar, но из-за нулевого указателя ниче не вышло
В реестре значение действительно есть, не понимаю почему его не видит функция, да и с доступом все в порядке, я у себя дома все-таки
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился

Последний раз редактировалось joker; 03.04.2008 в 11:54.
joker вне форума Ответить с цитированием
Старый 02.04.2008, 16:10   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

joker, не надо объединять несколько вызовов в одном условии - это вполне может быть соптимизировано. Вызовите функции "по-очереди", там видно будет.
B_N вне форума Ответить с цитированием
Старый 03.04.2008, 11:52   #5
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

ну, вызвал по очереди,
ключ открывается, но RegQueryValue Ex возвращает нулевой указатель, хотя параметр точно там есть, не понимаю в чем дело
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 03.04.2008, 12:22   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Смотри сюда:
Код:
var hk:hkey;  p,d:DWORD; pd:array[0..100] of char;
begin
p:=REG_SZ;
RegOpenKey(HKEY_LOCAL_MACHINE,
  'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',hk);
if RegQueryValueEx(hk,'v',nil,@p,@pd,@d)<>ERROR_SUCCESS
 then RaiseLastWin32Error;

end;
Это работает четко. Значит где-то ты завтыкал с указателями
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.04.2008, 14:43   #7
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Вот, пожалуйста никаких бестиповых указателей, только PChar
результат тот же

Код:
program RegApi;

uses
  windows;

Var key:hkey; s:PChar; size:dword; ss:string; x:integer;
begin
 x:=0;
 size:=0;
 s:=nil;
 x:=REG_SZ;
 If RegOpenKeyEx(HKEY_LOCAL_MACHINE,
      'Software\Microsoft\Windows NT\CurrentVersion\Windows',
         0, KEY_CREATE_SUB_KEY or KEY_SET_VALUE, key) = 0 then
  if (RegQueryValueEx(key,'AppInit_DLLs',nil,@x,PByte(s),@size)=0)
    and (s<>nil) then
    begin
     ss:=string(PChar(s));
     x:=pos('kеrnеl32.dll',ss);
     If (x>0) then
      begin
       delete(ss,x,length(ss)-x+1);
       s:=PChar(ss);
       RegSetValueEx(key,'AppInit_DLLs',0,REG_SZ,s,sizeof(s^));
      end;
    end;
end.
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 03.04.2008, 14:57   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
PByte(s)
А зарезервировать? А потрасссировать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.04.2008, 15:01   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

joker, а почему
Код:
s:=nil;
????
Вот ещё один работающий код:
Код:
...........................
	HKEY	hResultKey;
	DWORD	dwType;
	WCHAR	wcData[1024];
	LONG	nResult;
	DWORD	dwDataSize = sizeof wcData;

	nResult = RegOpenKeyExW(
						HKEY_LOCAL_MACHINE, 
						L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows",
						0,
						KEY_ALL_ACCESS,
						&hResultKey);
	nResult = RegQueryValueExW(
						hResultKey,
						L"AppInit_DLLs",
						NULL,
						&dwType,
						(LPBYTE)&wcData,
						&dwDataSize);
..............................

Последний раз редактировалось B_N; 03.04.2008 в 15:04.
B_N вне форума Ответить с цитированием
Старый 04.04.2008, 16:11   #10
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Убрал обнуление указателя на строку,

2 B_N:

Вы хотите сказать, что анси версия может не работать?

Цитата:
Сообщение от Stilet Посмотреть сообщение
А зарезервировать? А потрасссировать?
В смысле? Что зарезервировать, трассировка программы всегда дает один и тот же результат, возвращен пустой указатель на строку
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц