1

現在C++Builder 2007でコンパイルされているDelphiコンポーネント/コードをいくつか継承しました。現在、C ++ BuilderRADXEでコンポーネントをコンパイルしようとしています。Delphi(オブジェクトパスカル)を知りません。

競合しているように見える「サポート」関数のバージョンは次のとおりです。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 ++BuilderXEより前のバージョンのコードを使用していることです。特定の問題は、cxVer.incで宣言された条件付き定義がXEについて知らないことです。したがって、このcxClasses.pasファイルは、ターゲットにしているDelphiのバージョンを認識していません。

ほとんどの場合、必要な定義を追加するだけで、コードが機能し始めます。ただし、devexpressコードのバージョンは、ANSI文字列を使用するRAD Studio 2007用ですが、Unicode文字列を使用するXEでコンパイルしようとしています。この違いは、残りのソースコードに大きな変更を加える必要があります。

残念ながら、このコードをXEで機能させるには、すべてのサードパーティコンポーネントの最新バージョンを入手する必要があります。更新されたバージョンには、Unicodeテキストをサポートするために必要な変更が加えられています。

さらに、Unicodeをサポートするためにコードを大幅に作り直す必要があるかもしれませんが、私の経験はC ++ BuilderではなくDelphiを使用しているため、その点については確信が持てません。

于 2011-02-20T23:33:58.357 に答える