我正在尝试将一些设置存储在我的应用程序的资源中 但失败了 我不想使用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
但是存储了我写给资源的内容:( 还有其他更好的选择吗? 任何帮助,请
答案 0 :(得分:7)
The documentation for BeginUpdateResource
清楚地说明了为什么您的代码不起作用(强调添加):
pFileName [in]
LPCTSTR
用于更新资源的二进制文件。应用程序必须能够获得对此文件的写访问权限; pFileName引用的文件当前无法执行。如果pFileName未指定完整路径,则系统将在当前目录中搜索该文件。
如果您正在检查API函数的返回值并在失败时调用GetLastError
,您可能已经能够自己推断出错误的原因,就像文档建议的那样。
您可以在资源中存储设置,但不能将设置存储在您尝试存储其设置的程序的资源中。现在我们已经确定您不允许在程序本身中存储设置,您也可以放弃资源构思并使用更常规的方法在外部位置存储设置,例如注册表, INI文件,或者其他什么。如果您发现外部位置尚未进行任何设置,您可能仍希望从资源中读取一组默认设置,如全新安装后可能会发生的那样。
答案 1 :(得分:5)
让你的程序修改自己是一个坏主意。正如一对夫妇已经指出的那样,在大多数情况下,这将在Vista和Win7下严重失败。最好不要与操作系统作斗争。 Windows已为您的程序提供了几种不同的方式来存储其设置。您可以将INI或其他配置文件放在Program Files之外的某个文件夹中,也可以将其存储在Registry中,这可能是最佳选择。