2009-07-10 4 views
2

非常に古いActiveXコンポーネントの一部のソースコードを失ってしまっていました。 Active Xコンポーネントを呼び出すDelphi7プログラムがあります。それはほとんどのビットとはあまり変更することはできません。ただし、Active Xコンポーネントの一部の機能を更新する必要があります。アプリケーションをC#に移行して以来、ActiveXをC#クラスライブラリとしてやり直すことに決めました。Delphiプログラムで使用する既存のCOMオブジェクトの新しいC#バージョンの作成

私は概念を証明するために働く基本的なC#クラスライブラリを持っています。私はGUIDとレジストリをハックすることができますので、古いものに似ています。古いものと新しいもののタイプlibを見ると、それらは基本的にと同じです。若干の違いはありますが、私が思っていた何も問題はありません。プログラムIDを調べて

  1. レイトバインディング:

    は今、私の知る限り、新しいクラスライブラリを使用するための3つの方法があります。これは正常に動作します。

  2. タイプライブラリをインポートします。 (プロジェクト|インポートタイプライブラリ)これは問題ありません。

  3. ActiveXコンポーネントとしてインポートします。これにより、tlbファイルが生成されます。これは機能しません。コンポーネントを作成すると、「いいえ、そのようなインターフェイスが存在します」というメッセージが表示されます。クラスはポイントにロードされていますが、完全にロードされていません。

残念ながら、Delphiプログラムではオプション3が使用されています。そのため、この状況でクラスライブラリを使用するようにしなければなりません。どのように私はそのエラーを過ぎてどのようなアイデアですか?私はグーグルで見つけて、いくつかの参考文献を見つけましたが、何が問題なのかはわかりません。

2番目の質問です。私は一度それをやったので、私はこれを行う方法を知っておくべきですが、私はそれを流したようでした。私がDelphiにいるとき、私はTLBファイルを生成するためにImport ActiveXコンポーネントを行います。これで、生成された最初のC#クラスライブラリがActiveXコントロールのリストに表示され、そのためのユニットを作成できます。しかし、私はtestignのためのもう一つの単純なクラスライブラリを作成して、私はライブラリをActiveXコントロールのリストに表示することができますので、私はそれをインポートすることはできません。

アクティブXコンポーネントの作成単位は、インポートタイプライブラリの形式と必要なActiveX形式と異なる形式のTLB.pasを生成します。

答えて

2

ActiveXコントロールは、インターフェイスを実装するだけです。これはTComponentやTWinControlによく似ています。多くのActiveXコントロールインターフェイスを実装する必要があります。 COM/ActiveXで公開されるC#オブジェクトは、コントロールではなく、単純なクラスです。

ActiveXコントロールではないため、ActiveXコントロールのインポートには表示されません。あなたのC#クラスをActive Controlにすることは実現可能ではないと思います。

+0

しかし、作成した最初の例は、私のActiveXコントロールの中に表示されます。しかし、私はそれがどのようにそこに現れたのか分かりません!そして、このためのtlbは元のtlbとほとんど同じです! –

1

もう1つの可能性は、おそらく最もエレガントではないが、Delphiで新しいActiveX comオブジェクトを作成して、すでに動作しているどちらの方法でもC#クラスを呼び出すことです。

これは既存のDelphi 7アプリケーション用であると述べたので、C#側でCom Interopを使用し、オブジェクトをcomで公開し、Delphi 7アプリケーションから直接消費することができます。

最初のオプションを使用すると、既存のアプリケーションの変更を最小限に抑えることができますが、必要でない可能性が高いレイヤーが追加される可能性があります。

関連する問題