A primera vista te ha fallado la definición del tipo de datos de TSetting, las APIs que utilizas funcionan con punteros, y tu estas haciendo una declaracion de un puntero de un string, pero el string array de caracteres convencional, tiene un indicador del "Length".
Aparte noté que usabas SizeOf(Settings^))... SizeOf toda la vida te va a devolver un valor errado... por que no utilizaste Length?, en fin... le doy un pequeño retoque a tu unidad y la pongo en el post para que "el resto" la encuentre facilmente;
Código Delphi
[-]unit SettingsDef;
interface
function WriteSettings(Filename: PChar; Data: PChar): LongBool;
function ReadSettings(var Data: PChar): LongBool;
implementation
uses Windows;
const RC_SETTINGS = 'CFG';
function WriteSettings(Filename: PChar; Data: PChar): LongBool;
var hResource: Cardinal;
begin
hResource := BeginUpdateResource(Filename, False);
Result := LongBool(hResource);
if Result then
begin
Result := UpdateResource(hResource, RT_RCDATA, RC_SETTINGS, 0, Data, lstrlen(Data));
EndUpdateResource(hResource, False);
end;
end;
function ReadSettings(var Data: PChar): LongBool;
var hResource, hData: Cardinal;
begin
Result := False;
hResource := FindResource(hInstance, RC_SETTINGS, RT_RCDATA);
if Longbool(hResource) then
begin
hData := LoadResource(hInstance, hResource);
if LongBool(hData) then
begin
Data := LockResource(hData);
Result := True;
end;
end;
end;
end.
Ahora la unidad funciona a la perfección
.
Los cambios dan como resultado cambios en la llamada tambien;
Código Delphi
[-]procedure TForm1.Button1Click(Sender: TObject);
begin
if WriteSettings('..\Read\Project2.exe', 'ClubDelphi rules...') then
ShowMessage('Se ha grabado correctamente.');
end;
procedure TForm1.Button2Click(Sender: TObject);
var Data: PChar;
begin
if ReadSettings(Data) then
ShowMessage('Se ha cargado la configuración correctamente.');
Edit1.Text := Data;
end;
Saludos