Delphi 从接口之外的其他单元访问简单过程

Delphi 从接口之外的其他单元访问简单过程,delphi,localization,rad-studio,Delphi,Localization,Rad Studio,我想为我报告为的问题创建一个修补程序 简言之,在加载资源DLL后,我需要调用sysutils.ResStringDeleteAllModules以刷新缓存的资源字符串。不幸的是,这个例程不在接口部分,修改和重新编译sysutils.pas本身对我来说不起作用,因为我使用运行时包 所以我在寻找一种或多或少的方式来称呼它。我试过了,但没有找到通过trtti上下文的路径 我也尝试了这一点(针对我的特定问题,回退到loadRestringFunc=nil),但没有成功: procedure DropRe

我想为我报告为的问题创建一个修补程序

简言之,在加载资源DLL后,我需要调用sysutils.ResStringDeleteAllModules以刷新缓存的资源字符串。不幸的是,这个例程不在
接口
部分,修改和重新编译
sysutils.pas
本身对我来说不起作用,因为我使用运行时包

所以我在寻找一种或多或少的方式来称呼它。我试过了,但没有找到通过trtti上下文的路径

我也尝试了这一点(针对我的特定问题,回退到
loadRestringFunc=nil
),但没有成功:

procedure DropResStringCache;
begin
  var PModule:=LibModuleList;
  var P:=nil;
  while Assigned(PModule) do
  begin
    P:=GetProcAddress(PModule^.Instance,'ResStringDeleteAllModules');
    if Assigned(P) then
       break;
    PModule:=PModule.Next;
  end;
  if Assigned(P) then
    TProcedure(P)()
  else LoadResStringFunc:=nil;
end;

如果您有madExcept,则可以使用其
GetMapFileAddress
方法检索该方法的地址,如下所示:

var MethodAddr: Pointer := GetMapFileAddress(GetModuleName(HInstance), 'System.SysUtils', 'ResStringDeleteAllModules');

我相信JCL还支持运行时映射文件(或jdbg)解析,这将允许类似的功能。

如果您有madExcept,您可以使用它的
GetMapFileAddress
方法检索该方法的地址,如下所示:

var MethodAddr: Pointer := GetMapFileAddress(GetModuleName(HInstance), 'System.SysUtils', 'ResStringDeleteAllModules');

我相信JCL还支持运行时映射文件(或jdbg)解析,这将允许类似的功能。

目前正在考虑将所有resourcestring缓存代码复制到我的libs中的一个单元中,只需将系统的LoadResSrtingFunc替换为新的“uResStringCache”单元中的LoadResSrtingFunc即可。在这个过程中,我创建了一个更简洁、更面向对象的基于类的解决方案。我以前通过运行时反汇编来找到调用指令和地址。您需要能够找到一个用于计算目标函数的公共函数,并将其反汇编。@DavidHeffernan是的,我已经计算过类似的函数,例如使用映射文件。但为了解决RSP-30853的实际问题,我创建了自己的resourcestring缓存,它似乎做得很好。不幸的是,我的resourcestring特定解决方案并不是问题的答案。反汇编例程在我看来相当危险,因为你永远不知道EMB下一步会想到什么……你必须用每个新版本进行测试。但这并不太繁重。目前正在考虑将所有resourcestring缓存代码复制到我的libs中的一个单元中,只需将系统的LoadResrtingFunc替换为新的“uResStringCache”单元中的LoadResrtingFunc即可。在这个过程中,我创建了一个更简洁、更面向对象的基于类的解决方案。我以前通过运行时反汇编来找到调用指令和地址。您需要能够找到一个用于计算目标函数的公共函数,并将其反汇编。@DavidHeffernan是的,我已经计算过类似的函数,例如使用映射文件。但为了解决RSP-30853的实际问题,我创建了自己的resourcestring缓存,它似乎做得很好。不幸的是,我的resourcestring特定解决方案并不是问题的答案。反汇编例程在我看来相当危险,因为你永远不知道EMB下一步会想到什么……你必须用每个新版本进行测试。但这并不太繁重。