如何在资源中存储设置

ste*_*ve0 1 delphi

我试图在我的应用程序的资源中存储一些设置,但失败了我不想使用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
Run Code Online (Sandbox Code Playgroud)

但是存储我写给资源的那个:(还有其他更好的选择吗?任何帮助请

Rob*_*edy 7

文档BeginUpdateResource清楚地说明了为什么代码不起作用(强调添加):

pFileName [in]

LPCTSTR

用于更新资源的二进制文件.应用程序必须能够获得对此文件的写访问权限; pFileName引用的文件当前无法执行.如果pFileName未指定完整路径,则系统将在当前目录中搜索该文件.

如果您正在检查API函数的返回值并调用GetLastError失败,您可能已经能够自己推断出错误的原因,就像文档建议的那样.

您可以将设置存储在资源中,但不能将设置存储在您尝试存储其设置的程序的资源中.现在我们已经确定你不允许在程序中存储设置,你也可以放弃资源的想法,并使用更常规的方法在外部位置存储设置,例如注册表, INI文件,或者其他什么.如果您发现外部位置还没有任何设置,您可能仍希望从资源中读取一组默认设置,如全新安装后可能发生的那样.


Mas*_*ler 5

让你的程序修改自己是一个坏主意.正如一对夫妇已经指出的那样,在大多数情况下,这将在Vista和Win7下严重失败.最好不要与操作系统作斗争.Windows已为您的程序提供了几种不同的方式来存储其设置.您可以将INI或其他配置文件放在Program Files之外的某个文件夹中,也可以将其存储在Registry中,这可能是最佳选择.

  • 通过"程序文件之外的某个文件夹",Mason Wheeler表示"C:\ Users\<用户名>\AppData\Local\<您的公司>\<您的产品>\<产品版本>",其中第一部分(应该通过Windows API的`SHGetFolderPath`函数动态获取(包括"Local")(http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx) . (2认同)
  • "让你的程序修改自己是一个坏主意".同意.此外,它是高度可疑的行为,可能会被标记为恶意软件.让我想知道DEP或类似的东西是否可能阻止他的代码首先工作?不可否认,我在没有看代码的情况下跳入了"糟糕的想法"讲课. (2认同)