首页 > 解决方案 > 使用 Helpintfs::IHelpSystem 在 C++Builder 中给出错误“抽象类”

问题描述

我正在使用 C++Builder 并使用示例 Delphi 代码来调用一个名为 eViewer 的新帮助文件系统。当我转换下面的变量 IHelpSystem 的 Delphi 过程时,出现错误:变量类型 'System::Helpintfs::IHelpSystem' 是一个抽象类。错误文本如下。如何在 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' 是一个抽象类

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

帮助系统

HelpIntfs.GetHelpSystem

标签: delphic++builder

解决方案


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

IHelpSystem HelpSystem;

您只能通过指针 ( IHelpSystem*) 或引用 ( IHelpSystem&) 来声明这种类型的变量。事实上,C++ 中相当于 Delphi 语句:

var HelpSystem: IHelpSystem;

是:

IHelpSystem* HelpSystem;

但是,由于IHelpSystem是基于 Delphi 的接口,因此您实际上需要使用_di_IHelpSystem包装器类型(它是 的别名DelphiInterface<IHelpSystem>),它是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);
}

推荐阅读