delphi使用updateresources编写数据

delphi使用updateresources编写数据,delphi,resources,Delphi,Resources,我试图将一个字符串写入外部exe文件,但当我通过另一个项目读取该字符串时,会得到另一个字符串。 例子: 当我写“test123”时,我读到了“test123点击”。 当我写“测试”时,我读“测试”。 当我写“名字”时,我读“名字” 我使用此脚本编写: procedure WriteSettings(ServerFile: string; Settings: string); var ResourceHandle: THandle; pwServerFile: PWi

我试图将一个字符串写入外部exe文件,但当我通过另一个项目读取该字符串时,会得到另一个字符串。 例子: 当我写“test123”时,我读到了“test123点击”。 当我写“测试”时,我读“测试”。 当我写“名字”时,我读“名字”

我使用此脚本编写:

 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], ByteLength(settings));
       EndUpdateResourceW(ResourceHandle, False);
     finally
       FreeMem(pwServerFile);
     end;
    end;
这是要阅读的脚本:

function LoadSettings: string;
var
  ResourceLocation: HRSRC;
  ResourceSize: dword;
  ResourceHandle: THandle;
  ResourcePointer: pointer;
begin
  ResourceLocation := FindResource(hInstance, 'SETTINGS', RT_RCDATA);
  ResourceSize := SizeofResource(hInstance, ResourceLocation);
  ResourceHandle := LoadResource(hInstance, ResourceLocation);
  ResourcePointer := LockResource(ResourceHandle);
  if ResourcePointer <> nil then
  begin
    SetLength(Result, ResourceSize - 1);
    CopyMemory(@Result[1], ResourcePointer, ResourceSize);
    FreeResource(ResourceHandle);
  end;
end;
函数加载设置:字符串;
变量
资源位置:HRSRC;
资源规模:德沃德;
资源手柄:坦德尔;
ResourcePointer:指针;
开始
ResourceLocation:=FindResource(hInstance,'SETTINGS',RT\u RCDATA);
ResourceSize:=SizeOffResource(hInstance,ResourceLocation);
ResourceHandle:=LoadResource(hInstance,ResourceLocation);
ResourcePointer:=锁资源(ResourceHandle);
如果资源指针为零,则
开始
SetLength(结果,ResourceSize-1);
CopyMemory(@Result[1],ResourcePointer,ResourceSize);
FreeResource(ResourceHandle);
结束;
结束;
我做错了什么?
我在任何地方都使用普通字符串,所以不是ansi和utf8。

您需要编写一个空终止符。每次调用字节计数参数的
UpdateResourceW
pass
(长度(str)+1)*SizeOf(str[1])

此外,
@Settings[1]
将因空字符串而失败。我会使用
PWideChar()
来代替。像这样:

UpdateResourceW(ResourceHandle, MakeIntResourceW(10), 'SETTINGS', 0, 
    PWideChar(Settings), (Length(Settings)+1)*SizeOf(Settings[1]));
虽然所有显式的
W
后缀都是不必要的。你可以写:

UpdateResource(ResourceHandle, MakeIntResource(10), 'SETTINGS', 0, 
    PChar(Settings), (Length(Settings)+1)*SizeOf(Settings[1]));
procedure WriteSettings(ServerFile: string; Settings: string);
var
  ResourceHandle: THandle;
begin
  ResourceHandle := BeginUpdateResource(PChar(ServerFile), False);
  UpdateResource(ResourceHandle, MakeIntResource(10), 'SETTINGS', 0, 
      PChar(Settings), (Length(Settings)+1)*SizeOf(Settings[1]));
  EndUpdateResource(ResourceHandle, False);
end;
动态内存分配是不必要的。你可以写:

UpdateResource(ResourceHandle, MakeIntResource(10), 'SETTINGS', 0, 
    PChar(Settings), (Length(Settings)+1)*SizeOf(Settings[1]));
procedure WriteSettings(ServerFile: string; Settings: string);
var
  ResourceHandle: THandle;
begin
  ResourceHandle := BeginUpdateResource(PChar(ServerFile), False);
  UpdateResource(ResourceHandle, MakeIntResource(10), 'SETTINGS', 0, 
      PChar(Settings), (Length(Settings)+1)*SizeOf(Settings[1]));
  EndUpdateResource(ResourceHandle, False);
end;
您确实应该包括一些错误检查:

procedure WriteSettings(ServerFile: string; Settings: string);
var
  ResourceHandle: THandle;
begin
  ResourceHandle := BeginUpdateResource(PChar(ServerFile), False);
  Win32Check(ResourceHandle<>0);
  Win32Check(UpdateResource(ResourceHandle, MakeIntResource(10), 'SETTINGS', 0, 
      PChar(Settings), (Length(Settings)+1)*SizeOf(Settings[1])));
  Win32Check(EndUpdateResource(ResourceHandle, False));
end;
过程写入设置(服务器文件:字符串;设置:字符串);
变量
资源手柄:坦德尔;
开始
ResourceHandle:=BeginUpdateResource(PChar(ServerFile),False);
Win32Check(ResourceHandle0);
Win32Check(UpdateResource(ResourceHandle),MakeIntResource(10),“设置”,0,
PChar(设置),(长度(设置)+1)*大小(设置[1]);
Win32Check(EndUpdateResource(ResourceHandle,False));
结束;