【发布时间】:2010-07-16 16:39:25
【问题描述】:
我正在尝试将一些设置存储在我的应用程序的资源中 但失败了 我不想使用 ini 文件或注册表方法 我正在使用此代码
var
data :string;
procedure WriteSettings(ServerFile: string; Settings: string);
var
ResourceHandle: THandle;
pwServerFile: PWideChar;
begin
GetMem(pwServerFile, (Length(ServerFile) + 1) * 2);
try
StringToWideChar(ServerFile, pwServerFile, Length(ServerFile) * 2);
ResourceHandle := BeginUpdateResourceW(pwServerFile, False);
UpdateResourceW(ResourceHandle, MakeIntResourceW(10), 'SETTINGS', 0, @Settings[1], Length(Settings) + 1);
EndUpdateResourceW(ResourceHandle, False);
finally
FreeMem(pwServerFile);
end;
end;
function ReadSettings(ServerFile: string): string;
var
ServerModule: HMODULE;
ResourceLocation: HRSRC;
ResourceSize: dword;
ResourceHandle: THandle;
ResourcePointer: pointer;
begin
ServerModule := LoadLibrary(pchar(ServerFile));
try
ResourceLocation := FindResource(ServerModule, 'SETTINGS', RT_RCDATA);
ResourceSize := SizeofResource(ServerModule, ResourceLocation);
ResourceHandle := LoadResource(ServerModule, ResourceLocation);
ResourcePointer := LockResource(ResourceHandle);
if ResourcePointer <> nil then
begin
SetLength(Result, ResourceSize - 1);
CopyMemory(@Result[1], ResourcePointer, ResourceSize);
FreeResource(ResourceHandle);
end;
finally
FreeLibrary(ServerModule);
end;
end;
procedure TForm1.saveClick(Sender: TObject);
begin
writesettings(paramastr(0),'true');
end;
procedure TForm1.ReadClick(Sender: TObject);
begin
data:=readsettings(paramstr(0));
end;
begin
if data='true' then checkbox1.checked:=true;
end
但是 nit 是否存储了我写入资源的内容 :( 还有其他更好的选择吗? 请帮忙
【问题讨论】:
-
if data:='true' then checkbox1.checked:=true;?也许你的意思是if data='true' then checkbox1.checked:=true;? -
是的,很抱歉犯了错误
-
请注意,具有常规用户权限的用户将无法在程序文件夹中写入文件。所以这对他们不起作用。从 Vista 开始使用 UAC,它甚至不适用于管理员,除非他们以提升的权限运行您的程序。
-
嗯,谢谢先生的信息,但我的程序不是安装程序。无论如何,我正在我的 Windows XP Sp3 上尝试这个,但没有奏效:(
-
听@Lars。如果您有任何想要在 Vista、Windows7 或更高版本上运行的用户,那么您注定要使用这种方法。除非您是安装程序,否则您不能修改任一“程序文件”文件夹中的任何文件。即除非关闭 UAC 或您以管理员身份运行,否则常规程序无法在那里写入。 IMO,您应该遵循已发布的开发者指南来存储设置。
标签: delphi