Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Delphi: Ошибка при записи в реестр (https://forum.antichat.xyz/showthread.php?t=97474)

Ta2i4 22.12.2008 18:27

Delphi: Ошибка при записи в реестр функцией RegSetValueExW
 
Я юзаю Delphi 2007 и TMS Unicode Components Pack 1.7.0.2 (бывшие TNT Unicode Controls).

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

В коде:
Код:

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. Её код (лишнее удалено):
Код:

procedure TTntRegistry.WriteString(const Name, Value: WideString);
begin
  PutData(Name, PWideChar(Value), (Length(Value)+1) * SizeOf(WideChar), rdString);
end;

Смотрю PutData, куда и отсылает компилятор (лишнее удалено):
Код:

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 не пишет в реестр. В результате этого и возникает ошибка.

neprovad 22.12.2008 20:06

GetLastError еще никто не отменял между прочим, да и eregistryexception должен чего нить выдавать если есть причина.
upd:
sysutils.SysErrorMessage(GetLastError); // вернет string

Ta2i4 23.12.2008 05:39

Ладно, посмотрю, что не так.

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


Время: 20:20