PDA

Просмотр полной версии : Delphi: Ошибка при записи в реестр


Ta2i4
22.12.2008, 18:27
Я юзаю Delphi 2007 и TMS Unicode Components Pack 1.7.0.2 (http://www.tmssoftware.com/site/tmsuni.asp) (бывшие 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 работают, а она нет.