我想为我报告的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(解析,这将允许类似的功能。