使用 Helpintfs::IHelpSystem 在 C++Builder 中给出错误 'abstract class'

using Helpintfs::IHelpSystem gives an error 'abstract class' in C++Builder

我正在使用 C++Builder 并使用样本 Delphi 代码来调用名为 eViewer 的新帮助文件系统。当我在变量 IHelpSystem 下转换 Delphi 过程时出现错误:变量类型 'System::Helpintfs::IHelpSystem' 是一个抽象 class。错误文本如下。如何在 C++Builder 中使用变量 IHelpSystem 和函数 GetHelpSystem?

//Original Delphi
procedure TFrmHelpViewerMain.btnShowTopicClick(Sender: TObject);
var
  HelpSystem: IHelpSystem;
begin
  GetHelpSystem(HelpSystem);
  if assigned(HelpSystem) then
    HelpSystem.ShowTopicHelp('topic3', Application.HelpFile);
 end;


//My C++Builder code
#include <System.HelpIntfs.hpp>
void __fastcall TForm99::btnShowTopicClick(TObject *Sender)
{
  IHelpSystem HelpSystem; //<< Error Here

  GetHelpSystem(HelpSystem);

  if( Assigned(HelpSystem) ){
    HelpSystem->ShowTopicHelp("topic3", Application->HelpFile);
  }
}

[bcc64错误]CBtest_Unit1.cpp(97):变量类型'System::Helpintfs::IHelpSystem'是一个抽象class

以下是 Embaradero 网站上讨论 IHelpSystem 的帮助页面。

IHelpSystem

HelpIntfs.GetHelpSystem

如错误消息所述,IHelpSystem 是一个抽象 class(它具有在派生的 classes 中实现的纯虚方法),因此您不能直接实例化它,就像您在 C++ 代码中尝试做的那样:

IHelpSystem HelpSystem;

您只能通过指针(IHelpSystem*)或引用(IHelpSystem&)声明此类型的变量。事实上,Delphi 语句的 C++ 等价物:

var HelpSystem: IHelpSystem;

是:

IHelpSystem* HelpSystem;

但是,由于 IHelpSystem 是基于 Delphi 的接口,您实际上需要使用 _di_IHelpSystem 包装器类型(这是 DelphiInterface<IHelpSystem>), which is what GetHelpSystem() 实际输出的别名在 C++ 中:

extern DELPHI_PACKAGE bool __fastcall GetHelpSystem(/* out */ _di_IHelpSystem &System)/* overload */;

试试这个:

#include <System.HelpIntfs.hpp>

void __fastcall TForm99::btnShowTopicClick(TObject *Sender)
{
    _di_IHelpSystem HelpSystem;
    GetHelpSystem(HelpSystem);
    if (HelpSystem)
        HelpSystem->ShowTopicHelp(_D("topic3"), Application->HelpFile);
}