从不在接口中的另一个单元访问简单的过程



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

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

因此,我正在寻找一种或多或少的黑客方式来称呼它。我尝试过,但没有找到通过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(解析,这将允许类似的功能。

最新更新