| 
| 
 | Вопрос # 6 324/ вопрос решён / | 
 |  Доброго времени суток, уважаемые эксперты!Мне нужно работать с набором строк - записать в реестр и считать из реестра.
 В случае чтения - у меня получилось.
 Делаю я это с помощью процедуры
 ReadREG_MULTI_SZ (расписана в приложении). А вот записать набор строк корректно у меня не получается. В результате преобразования (также приведены ниже) получаю не набор строк, а одну строку и дальше набор невразумительных символов.
 Поскажите как корректно записать Tstrings в параметр REG_MULTI_SZ регистра.
 Приложение:Переключить в обычный режим procedure ReadREG_MULTI_SZ(const CurrentKey: HKey; const Subkey, ValueName: string;   Strings: TStrings); var   valueType: DWORD;   valueLen: DWORD;   p, buffer: PChar;   key: HKEY; begin   // Clear TStrings   // TStrings leeren   Strings.Clear;   // open the specified key   // CurrentKey Schlussel offnen   if RegOpenKeyEx(CurrentKey,                   PChar(Subkey),                   0, KEY_READ, key) = ERROR_SUCCESS then   begin     // retrieve the type and data for a specified value name     // Den Typ und Wert des Eintrags Ermitteln.     SetLastError(RegQueryValueEx(key,                  PChar(ValueName),                  nil,                  @valueType,                  nil,                  @valueLen));     if GetLastError = ERROR_SUCCESS then       if valueType = REG_MULTI_SZ then       begin         GetMem(buffer, valueLen);         try           // receive the value's data (in an array).           // Ein Array von Null-terminierten Strings           // wird zuruckgegeben           RegQueryValueEx(key,                           PChar(ValueName),                           nil,                           nil,                           PBYTE(buffer),                           @valueLen);           // Add values to stringlist           // Werte in String Liste einfugen           p := buffer;           while p^ <> #0 do           begin             Strings.Add(p);             Inc(p, lstrlen(p) + 1)           end         finally           FreeMem(buffer)         end       end       else         raise ERegistryException.Create('Stringlist expected/ String Liste erwartet...')     else       raise ERegistryException.Create('Cannot Read MULTI_SZ Value/'+         'Kann den MULTI_SZ Wert nicht lesen...');   end; end;   procedure ...var   Buffer: Pointer;  BufSize: DWORD;  i, j, k: Integer;  s: string;  p: PChar;begin    BufSize := 0;  for i := 0 to list.Count - 1 do    inc(BufSize, Length(list[i]) + 1);  inc(BufSize);  GetMem(Buffer, BufSize);  k := 0;  p := Buffer;  for i := 0 to list.Count - 1 do  begin    s := list[i];    for j := 0 to Length(s) - 1 do    begin      p[k] := s[j + 1];      inc(k);    end;    p[k] := chr(0);    inc(k);  end;  p[k] := chr(0); end;   
|  |   Вопрос задала: Ak_el_a (статус: Посетитель)Вопрос отправлен: 30 ноября 2012, 21:41
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 1; последнее сообщение — 29 декабря 2012, 14:00; участников в обсуждении: 1. 
|   | mirt.steelwater (статус: Посетитель), 29 декабря 2012, 14:00 [#1]:Процедура - какая-то страшная ахинея. Для преобразования строк в PChar используй приведение типов:
 p := PChar(s);
 Для чтения и записи в реестр используй модуль registry.
 Зачем еще какие-то страшные библиотеки?
 
 function RegReadStrings (const RootKey: HKEY; const Key, ValueName: String; var List: TStrings) : Boolean;
var
    reg : TRegistry;
begin
    reg := TRegistry.Create;
    try
        reg.RootKey := RootKey;
        Result := reg.OpenKey (key,False);
        if Result then
        begin
            List.Text := reg.ReadString (ValueName);
        end;
    finally
        FreeAndNil (reg);
    end;
end;
 
function RegWriteStrings (const RootKey: HKEY; const Key, ValueName: String; const List: TStrings) : Boolean;
var
    reg : TRegistry;
begin
    reg := TRegistry.Create;
    try
        reg.RootKey := RootKey;
        Result := reg.OpenKey (key,True);
        if Result then
        begin
            reg.WriteString (ValueName,List.Text);
        end;
    finally
        FreeAndNil (reg);
    end;
end;Ⓐ свобода сопротивление солидарность |  18 марта 2013, 21:31: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |