1

我继承了一些当前使用 C++ Builder 2007 编译的 Delphi 组件/代码。我现在只是尝试使用 C++ Builder RAD XE 编译组件。我不知道德尔福(对象帕斯卡)。

以下是似乎有冲突的“支持”功能的版本。我可以使用编译器开关来使 RAD XE 向后兼容吗?或者我可以对这些函数调用做些什么来纠正模棱两可的性质?

我得到的错误是:

[DCC Error] cxClasses.pas(566): E2251 Ambiguous overloaded call to 'Supports'
  SysUtils.pas(19662): Related method: function Supports(const TObject; const TGUID; out): Boolean;
  cxClasses.pas(467): Related method: function Supports(TObject; const TGUID; out): Boolean;



{$IFNDEF DELPHI5}

procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;

function Supports(const Instance: IUnknown; const Intf: TGUID; out Inst): Boolean; overload;
begin
  Result := (Instance <> nil) and (Instance.QueryInterface(Intf, Inst) = 0);
end;


function Supports(Instance: TObject; const Intf: TGUID; out Inst): Boolean; overload;
var
  Unk: IUnknown;
begin
  Result := (Instance <> nil) and Instance.GetInterface(IUnknown, Unk) and
    Supports(Unk, Intf, Inst);
end;

{$ENDIF}


{$IFNDEF DELPHI6}

function Supports(const Instance: TObject; const IID: TGUID): Boolean;
var
  Temp: IUnknown;
begin
  Result := Supports(Instance, IID, Temp);
end;

{$ENDIF}
4

1 回答 1

5

您正在使用一些 devexpress 组件,问题是您使用的是 C++ Builder XE 之前的代码版本。特殊的问题是 cxVer.inc 中声明的条件定义不了解 XE。因此,这个 cxClasses.pas 文件不知道它针对的是哪个版本的 Delphi。

在大多数情况下,您只需添加必要的定义,代码就会开始工作。但是,您的 devexpress 代码版本适用于使用 ANSI 字符串的 RAD Studio 2007,但您尝试在使用 Unicode 字符串的 XE 上进行编译。这种差异需要对源代码的其余部分进行重大更改。

不幸的是,要让此代码在 XE 上运行,您需要掌握所有 3rd 方组件的最新版本。更新的版本进行了必要的更改以支持 Unicode 文本。

更重要的是,您的代码可能还需要一些重大的返工来支持 Unicode,但我不太确定这一点,因为我的经验是使用 Delphi 而不是 C++ Builder。

于 2011-02-20T23:33:58.357 回答