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