| 
| 
 | Вопрос # 5 460/ вопрос решён / | 
 |  Здравствуйте Нужна Ваша помощь!Никак не получается считать ключ реестра при помощи API
 Хочу считать Имя программы  (DisplayName) из ключа:
 SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TrueCrypt
 RegQueryValueEx ничего не выводит
 
 
 
 procedure TForm1.Button3Click(Sender: TObject);
var
MyKey: HKey;
dwType: Integer;
Result:String;
dwKeySize: Integer;
 
 begin
  RegOpenKeyEx( HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TrueCrypt', 0, KEY_READ, MyKey
);
  RegQueryValueEx(MyKey, 'DisplayName', nil, @dwType, PByte(Result), @dwKeySize );
  ShowMessage(Result);
 end; 
|  |   Вопрос задал: neon (статус: Посетитель)Вопрос отправлен: 29 июня 2011, 12:31
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, neon!Конечно ничего не получится. Потому что функция хочет буффер, а Вы подсовываете указатель на строку. А апи функции винды ничего не знают о типе string. У Вас это параметр Result:String;
 Правильнее сделать так.
 
 procedure TForm1.Button3Click(Sender: TObject);
var
MyKey: HKey;
dwType: Integer;
data: Array[0.256] of Char;
dwKeySize: Integer;
 
 begin
  RegOpenKeyEx( HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TrueCrypt', 0, KEY_READ, MyKey
);
  RegQueryValueEx(MyKey, 'DisplayName', nil, @dwType, @data, @dwKeySize );
  ShowMessage(string(data));
 end; в функции переменная типа result - это особая переменная, поэтому лучше ее не переопределять, даже в процедурах, что бы потом не было различных "спецэффектов".
 Также посмотрите пример тут http://www.delphifaq.net/how-to-access-the-registry-using-windows-api/
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 29 июня 2011, 12:45
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо большое! Вы мне очень помогли! |  
 Мини-форум вопросаВсего сообщений: 9; последнее сообщение — 4 июля 2011, 17:02; участников в обсуждении: 2. 29 июня 2011, 13:03: Статус вопроса изменён на решённый (изменил автор вопроса — neon) 
|   | bugmenot (статус: 3-ий класс), 29 июня 2011, 14:25 [#1]: Цитата (Вадим К): result - это особая переменная, поэтому лучше ее не переопределять, даже в процедурах Это - фантазии, никакого UB в процедурах не будет, в функциях же будет просто "Identifier redeclared".
 Цитата (Вадим К): Array[0.256] of Char;что значит волшебное число 257? виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Вадим К (статус: Академик), 29 июня 2011, 14:51 [#2]: Цитата (bugmenot): Это - фантазии, никакого UB в процедурах не будет, в функциях же будет просто "Identifier redeclared". Лучше не привыкать объявлять так переменные. В один прекрасный момент код перекочевывает с процедуры в функцию и начинаются приключения. Хорошо, в этом случае они скорее всего будут исправлены быстро.
 
 Цитата (bugmenot): что значит волшебное число 257? именно это и значит - 257. и не битом больше.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | bugmenot (статус: 3-ий класс), 29 июня 2011, 14:51 [#3]:А ответ почему RegQueryValueEx ничего не считывает и не возвращает код ошибки (который, кстати, никак не проверяется) кроется в описании параметра: Цитата: lpData [out] A pointer to a buffer that receives the value's data. This parameter can be NULL if the data is not required.
 ...
 If lpData is NULL, and lpcbData is non-NULL, the function returns ERROR_SUCCESS and stores the size of the data, in bytes, in the variable pointed to by lpcbData. This enables an application to determine the best way to allocate a buffer for the value's data.
 
 при том, что указатель на пустую строку является нулевым указателем (NULL или nil, по-нашему)
 Поэтому следует инициализировать строку и уже потом считать данные:
 RegQueryValueEx(MyKey, 'DisplayName', nil, @dwType, PByte(Result), @dwKeySize); // здесь lpData = nil и запрашивается
только кол-во байт
SetLength(Result, dwKeySize);
RegQueryValueEx(MyKey, 'DisplayName', nil, @dwType, PByte(Result), @dwKeySize); виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | bugmenot (статус: 3-ий класс), 30 июня 2011, 19:13 [#4]: Цитата (Вадим К): Лучше не привыкать объявлять так переменные Почему?
 
 Цитата (Вадим К): код перекочевывает с процедуры в функцию и начинаются приключения Какие?
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Вадим К (статус: Академик), 2 июля 2011, 19:21 [#5]:Вторая цитата отвечает на первый вопрос. 
 Какие приключения? да самые простые. Компилятор выдает различные ошибки или в результате совсем получается другое...
 Да, может быть Result - это и не такое большое приключение, но с такого все начинается. Лично видел код, в котором форма имела имя Button1, а Button2 - это был Edit. И это не для защиты от взлома или с другим злым умыслом было сделано, а просто так красиво. А потом, когда такой код правишь, глаза на лоб лезут...
 Вывод - каждая сущность должна иметь свое правильное имя.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | bugmenot (статус: 3-ий класс), 3 июля 2011, 11:37 [#6]: Цитата (Вадим К): Компилятор выдает различные ошибки Это опасно?
 
 Цитата (Вадим К): или в результате совсем получается другое Опять общие слова и ничего конкретного для инженера, а не для знахаря. Если кроме иррациональных страхов ничего нет, может быть не стоит спорить?
 
 Цитата (Вадим К): каждая сущность должна иметь свое правильное имя Капитан Очевидность упускает из виду, что тупая зубрёжка "правильных" идентификаторов приведет к прямо противожному результату.
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Вадим К (статус: Академик), 3 июля 2011, 19:55 [#7]:зубрить "правильные" идентификаторы - не нужно. их даже и нет. Но знать основные, которые не стоит использовать - стоит. Да, я не знахарь, я инженер.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Вадим К (статус: Академик), 3 июля 2011, 19:55 [#8]:зубрить "правильные" идентификаторы - не нужно. их даже и нет. Но знать основные, которые не стоит использовать - стоит. Да, я не знахарь, я инженер.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | bugmenot (статус: 3-ий класс), 4 июля 2011, 17:02 [#9]: Цитата (Вадим К): я не знахарь однако опять нет удовлетворительных примеров, которые могут продемонстрировать почему и зачем.
 
 PS: я постоянно леплю запяточия перед else, наверное это и есть ужасные приключения и мне надо подумать о карьере дворника...
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |