1

私はこのプロジェクトに取り組んでおり、プロジェクトの大部分のソース コードはありませんが、いくつかの情報を含む .DLL ファイルがあります。DLL ファイルにバグがあります。バグを含むクラスのサブクラスを作成でき、アクセスできる時点で既に存在するオブジェクトをダウンキャストしたいと考えています。問題は、オブジェクトにアクセスできる任意の時点で、バリアントとしてキャストされることです。私は次のことを試しました(コンテキストを削除するために編集しました):

tempSubclass := Subclass(ParentClass(Integer(oleVariantCast)));

しかし、次のエラーが表示されます。

Could not convert variant of type (Dispatch) into type (Integer)

オブジェクトへのポインターを OleVariant から取得したり、型キャストを行う他の方法はありますか?

ありがとうございました。

編集: はい、Parentclass は IDispatch を実装します。訂正: 親クラスは、IDispatch から継承するインターフェイスを実装します。

4

2 に答える 2

2

Dispatch Variant は、クラスではなく、非常に汎用的なインターフェイスです (Delphi オブジェクトに型キャストできないのはそのためです。Delphi オブジェクトではなく、キャストしようとしているクラスの VMT を持っていません)。になる)。

DLL にタイプ ライブラリが含まれている場合は、それを Delphi にインポートしてから、最初に他のものにキャストすることなく、含まれているインターフェイスを直接使用できます。

DLL 内の実際のインターフェイスの実装に関するドキュメントがある場合は、そのインターフェイスを使用する Delphi クラスを作成できます。インターフェイスを表す型を定義して変換し、次を使用してアクセスできますas

type
  TYourInterface=interface(IDispatch)
    // the interface definition here
  end;

var
  Intf: TYourInterface;
begin
  Intf := YuorOleVariant as TYourInterface;
  // work with interface from DLL using Intf.
  Intf := nil;
end;
于 2011-03-14T18:47:00.207 に答える
1

最初に IUnknown への型キャストを試してください。

tempSubclass := Subclass(ParentClass(Integer(IUnknown(oleVariantCast))));
于 2011-03-14T19:09:17.577 に答える