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