2014-10-07 67 views
-1

这是我的问题。在主应用程序和DLL之间共享ICustomHelpViewer

我有一个加载DLL的应用程序。我有源和控制主应用程序和DLL。我希望DLL使用与主应用程序中使用的帮助查看器相同的帮助查看器(由System.HelpIntfs.RegisterViewer注册)。

现在,我相信如果DLL和主应用程序都“与运行时软件包链接”,那么这将自动完成(IIRC)。为了这个问题,我们假设这个选项不在桌面上(政治......)

我首先研究了在System.HelpIntfs单元中手动分配变量HelpManager: IHelpManager的可能性。但该变量似乎不可访问(它在实现部分中,并且没有任何过程似乎允许设置它)。

然后我看着TApplication。手动分配FHelpSystem : IHelpSystem将解决我的问题,但该变量只能通过只读属性访问。

我想过将主应用程序的ICustomHelpViewer传递给DLL并调用RegisterViewer,但后来我开始担心它会“损坏”,并且在DLL卸载时可能会“关闭”。

然后我想创建另一个ICustomHelpViewer,我将它传递给我的DLL,它只是将所有相关的调用映射到应用程序的ICustomHelpViewer。我想我应该转发除ShutDownSoftShutDownNotifyId之外的所有呼叫。我对吗?

有没有更好的选择?

+0

我认为我会做这样的:1.不包括帮助查看器单元的DLL,以便没有帮助经理获得注册。 2.为DLL的'Application'对象添加一个'OnHelp'事件处理程序。 3.让'OnHelp'事件处理程序委托给主机可执行文件的'Application.HelpCommand'。 – 2014-10-07 15:23:39

回答

0

(Halway通过书面方式我的问题,我想这个选项。我以为我还是会发布问题,看看更好的选择提出了建议。)

于是,我去了选项实际上是设置TApplication的。 FHelpSystem。作为一个旧计时器,它不会立即发生,私人变量不再是真正的私人变量。

在我的主应用程序中,我调用System.HelpIntfs.GetHelpSystem来获得对传递给我的DLL的主应用程序的帮助系统的引用。

在我的DLL中,我通过RTTI设置TApplication的FHelpSystem。我用下面的功能:

procedure SetRttiField(AInstance : TObject; const AFieldName : string; AValue : TValue); 
var 
    vRTTI : TRttiContext; 
    vRTTIType : TRttiType; 
    vRttiField : TRttiField; 
begin 
    vRTTI := TRttiContext.create; 

    vRttiType := vRTTI.GetType(AInstance.ClassInfo); 
    if not Assigned(vRttiType) then 
    EXIT; 

    vRttiField := vRTTIType.GetField(AFieldName); 
    if not Assigned(vRttiField) then 
    EXIT; 

    vRttiField.SetValue(AInstance, AValue); 
end; 

,并调用它像这样

SetRttiField(Application, 'FHelpSystem', TValue.From(aHelpSystem)) 
+1

你不需要RTTI。你可以用帮手破解它。 – 2014-10-07 15:27:04

相关问题