2

我正在尝试德尔福 10.4。本地化 Windows 应用程序在过去就像一个魅力,但现在当我动态加载 RC DLL 文件时,它只更改 RCDATA,而不再更改“字符串表”。

我正在使用此代码(作为快速恢复)

NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE); 
....
CurModule.ResInstance := NewInstance;

FileName是具有资源(RCDATA 和“字符串表”)的 DLL 文件,我可以使用“Resource Hacker”软件进行编辑,并且可以看到它包含预期的“字符串表”内部。

它适用于 RCDATA(所有表格都被翻译)但不再包含Resourcestring在任何.pas文件的部分中的“字符串表”,并且所有字符串都保留在原始语言中。

它在以前的 Delphi 版本(如 10.2)中运行良好,我不知道为什么它在这个版本中失败。

4

2 回答 2

3

还有另一种解决方案。通过将 LoadResStringFunc 分配给 nil 来禁用新的缓存。这样做的好地方是在程序的开头。

begin
>>> ADD THIS to disable the caching
  LoadResStringFunc := nil;
>>>
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
于 2020-11-08T21:45:48.537 回答
3

核心问题 问题是资源字符串现在被缓存了,在你加载新的资源数据后你无权清除缓存:(

请参阅https://quality.embarcadero.com/browse/RSP-30853 (如果您认为必须修复它,请投票)

解决方法 我将资源字符串缓存机制“克隆”到一个单独的单元中并重新路由LoadResStringFunc到我的克隆单元。这里我允许访问 resstringcache,因此可以在加载新资源后清除它。

于 2020-11-08T21:09:46.793 回答