2011-06-20 6 views
1

私は、しばらくの間うまく機能していた既存のActiveX/COMコンポーネントを持っています。このActiveXコンポーネントは、当初、マシンごとに1つのクライアントアプリケーションによって使用されるように設計されていました。しかし、今では、このActiveXコンポーネントを拡張して、同じPC内の複数のクライアントアプリケーションで使用する必要があります。実行時に生成されたUUIDを持つIDLで作成されたActiveX/COMコンポーネントを登録して使用する

私は、COMがある理由は再利用性であり、これを管理する方法があることを知っています。たとえば、参照カウントなどですが、私の問題は異なります。お読みください...

これらのクライアントアプリケーションはそれぞれ異なる場合、これらのクライアントアプリケーションはスタンドアロンアプリケーションとして動作します。つまり、個々のアプリケーションとしてインストールされ、アンインストールされます。彼らはそれぞれ、このActiveXコンポーネントのコピーを持ち、独自のインストールディレクトリにインストールします。すべてのクライアントアプリケーションには、このActiveXコンポーネントがインストール、使用、およびアンインストールされる独自のコピーがあります。

以下に、基本的に何が起こるかの手順を示します。以下のステップ4は、実際の問題である:

  1. それはCOMを使用しているので、私はクライアントアプリケーションXを初めてインストールするときは、インストーラがCOMコンポーネントを登録し、このエントリとレジストリ内の「タイプライブラリ」エントリを作成しますIDLおよび.rgsで定義されているUUID。

  2. クライアントアプリケーションXをアンインストールする前に、YのインストーラはYの現在のディレクトリにあるActiveXコンポーネントのパスに "typelib"の "win32"値を更新します。

  3. クライアントアプリケーションXをアンインストールすると、このtypelibエントリがレジストリから削除されます。

  4. この時点で、私はアプリケーションYをアンインストールしようとすると、typelibのエントリがないために失敗します。 Xのアンインストーラはすでにこのエントリを削除しています。

この問題を解決するには、私はタイプライブラリを使用してバイパスするか、私が今直面しています問題なくActiveXコンポーネントを使用するための別の方法(可能な場合)を使用しようとしています。

問題はこれまでに発生しました。 - クライアントアプリケーションごとに異なるが、同じActiveXコンポーネントに対して異なるタイプライブラリエントリを持つこと。

誰かが私を案内し、良い、エレガントなソリューションを提案できますか?

+0

1つの解決方法は、登録不要のCOMを使用することです。http://msdn.microsoft.com/en-us/library/ms973913.aspx – Paolo

+0

@Paolo:ありがとうございました!それは確かに私が今取り組んでいるオプションです。どのようにそれについて行くすべてのポインター? – aeon

答えて

-1

私はこの問題を、rgsファイルを変更してIDLを作成することで解決しました。

関連する問題