2011-03-14 12 views
0

私はこのプロジェクトでは、プロジェクトの大きな断片のソースコードがないのに、いくつかの情報を含む.DLLファイルがあります。 DLLファイルにバグがあります。私はそれのバグを持つクラスのサブクラスを作成することができ、私はそれにアクセスできる点に既に存在するオブジェクトをダウンキャストしたいと思います。問題は、いつでもオブジェクトにアクセスでき、バリアントとしてキャストされていることです。OleVariantをDelphiのオブジェクトに変換する

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

が、私は次のエラーを取得::私は(コンテキストを削除するために編集した)次のことを試してみた

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

をOleVariantのうち、オブジェクトへのポインタを取得する他の方法はありますおよび/または型キャスティングが関与していますか?

ありがとうございます。

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

+1

は、dllのコードと同じバージョンのデルファイでコンパイルされたコードですか? –

+0

私が知る限り、それはすべてDelphi 6です。 – mnuzzo

+0

あなたは、モジュールの境界を越えてオブジェクトを消費しようとしているかどうかを確かめたいでしょう。このオブジェクトリファレンスを抽出したら、やっていることにはまだまだ従うことができません。 –

答えて

1

最初のIUnknownにキャストしてみタイプを。

tempSubclass := Subclass(ParentClass(Integer(IUnknown(oleVariantCast)))); 
+0

これはちょうど「それはコンパイルされますが、実際には私にとってはうまくいく」と叫びます。 –

+0

@Warren Pここでは、IUnknownを介してOleVariantからインターフェイスに移動する方法について説明しました。http://stackoverflow.com/questions/4938601/getting-an-istream-from-an-olevariant/4938818#4938818この場合に動作するかどうかは分かりません。 –

1

ディスパッチバリアントはクラスではなく、かなり一般的なインターフェイスです(デルファイオブジェクトに型キャストすることができない理由です。これは1つではなく、クラスのVMTを持たないそれをキャストしようとしている)。

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

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; 
+0

"tempSubclass:= oleVariantCast as Subclass"と言っていて、 "Operatorはこのオペランドの型には当てはまりません"というエラーが出ます。 – mnuzzo

+0

あなたの言っていることを誤解しましたが、インターフェイスで試してみると同じエラーが表示されます。 – mnuzzo

関連する問題