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