Delphi: Ошибка при записи в реестр

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Ta2i4, 22 Dec 2008.

  1. Ta2i4

    Ta2i4 New Member

    Joined:
    10 Sep 2007
    Messages:
    17
    Likes Received:
    2
    Reputations:
    0
    Delphi: Ошибка при записи в реестр функцией RegSetValueExW

    Я юзаю Delphi 2007 и TMS Unicode Components Pack 1.7.0.2 (бывшие TNT Unicode Controls).

    Подключаю в uses юнит TntRegistry.

    В коде:
    Code:
    if myreg.OpenKey('*\shell\MyApp\command',True)
    then begin
      myreg.WriteString('','"'+TntApplication.ExeName+'" "%1"');
      myreg.CloseKey;
    end;
    Возникает ошибка. Если закомментировать myreg.WriteString, то ошибки нет. Ошибка кроется именно в WriteString (пока не проверял WriteInteger, WriteBool и другие). Ошибка - "Failed to set data for ''."

    Изучаю функцию WriteString. Её код (лишнее удалено):
    Code:
    procedure TTntRegistry.WriteString(const Name, Value: WideString);
    begin
       PutData(Name, PWideChar(Value), (Length(Value)+1) * SizeOf(WideChar), rdString);
    end;
    Смотрю PutData, куда и отсылает компилятор (лишнее удалено):
    Code:
    procedure TTntRegistry.PutData(const Name: WideString; Buffer: Pointer;
      BufSize: Integer; RegData: TRegDataType);
    var
      DataType: Integer;
    begin
        DataType := RegDataToDataType(RegData);
        if RegSetValueExW(CurrentKey, PWideChar(Name), 0, DataType, Buffer,
          BufSize) <> ERROR_SUCCESS then
          raise ERegistryException.CreateResFmt(@SRegSetDataFailed, [Name]);
    end;
    Вот не пойму, почему RegSetValueExW не пишет в реестр. В результате этого и возникает ошибка.
     
    #1 Ta2i4, 22 Dec 2008
    Last edited: 22 Dec 2008
  2. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    GetLastError еще никто не отменял между прочим, да и eregistryexception должен чего нить выдавать если есть причина.
    upd:
    sysutils.SysErrorMessage(GetLastError); // вернет string
     
    #2 neprovad, 22 Dec 2008
    Last edited: 22 Dec 2008
  3. Ta2i4

    Ta2i4 New Member

    Joined:
    10 Sep 2007
    Messages:
    17
    Likes Received:
    2
    Reputations:
    0
    Ладно, посмотрю, что не так.

    Ошибка - "Failed to set data for ''." То есть не может записать в значение ''. Подставлял 'test', выдает "Failed to set data for 'test'."
    В Delphi IDE после ошибки при нажатии в сообщении кнопки 'Break' открывается юнит TntRegistry и показывает функцию TTntRegistry.PutData. Видимо RegSetValueExW некорректно работает.
    Также у меня возникала ошибка с функцией SHFileOperationW из ShellAPI. SHFileOperation и SHFileOperationA работают, а она нет.