从不在界面中的另一个单元访问简单过程

问题描述

我想为我报告为RSP-30853的问题创建一个补丁

简而言之,在加载我的资源DLL之后,我需要调用sysutils.ResstringDeleteallModules以便刷新缓存的资源字符串。不幸的是,该例程不在interface部分中,并且在我使用运行时程序包时,修改和重新编译sysutils.pas本身对我来说不会这样做。

所以我正在寻找一种或多或少的 hacky 方式来称呼它。我尝试过,但没有找到通过TRTTIContext的路线。

我也对此进行了尝试(针对我的特定问题,后退到LoadResstringFunc=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)解析,这将允许类似的功能。