问题描述
简而言之,在加载我的资源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)解析,这将允许类似的功能。