0

同じコード ベースを 2 つの異なる ActiveX に使用する必要がある ActiveX に取り組んでいます。つまり、複数の DLL から構築された単一のソリューションがあります。ActiveX A の CAB を作成するためのソリューションをビルドするときに、DLL のクラス ID を特定のものに変更し、2 番目の ActiveX の CAB を作成するためにソリューションをビルドするときに、クラス ID を別のものに変更しました。

同じマシンで実行できるようにするには、両方の ActiveX が必要です。基本的に、異なるバージョンの ActiveX を実行する特定のシナリオ (ActiveX A は ActiveX B よりも古いコード バージョン) で望ましくない動作が発生することを除いて、正常に動作します。ActiveX が ActiveX B (別のコード バージョン) からいくつかの DLL をロードしているようです。

長い説明で申し訳ありませんが、最後の重要な情報は、両方の ActiveX が同じコードに由来するため、ActiveX を呼び出す JavaScript に公開される同じクラス名を持っていることです。レジストリでは、以下を除くすべてのキーが完全に分離されています (NetworkInterface は公開クラスです)。

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MyActiveX.NetworkInterface\CLSID]
@="{31ED2205-F6AE-4133-AD30-60CA2783ADA6}"

ActiveX をインストールすると、正しいクラス ID でこのエントリが表示されますが、2 番目の ActiveX をインストールすると、キーは 2 番目の ActiveX によって上書きされます。

私が達成しようとしていることを達成することは可能ですか? 同じクラスを異なるクラス ID で登録する方法はありますか?

ありがとう。

4

1 に答える 1

0

@Lior、「同じクラスを異なるクラスIDで登録する」というフレーズで質問に答えました。実際、私たちはProgIDまたはプログラム識別子について話しています - あなたの場合は MyActiveX.NetworkInterface です。

ProgID 専用のレジストリ ハイブは HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ だけです。クライアント コードで ProgID を使用してコンポーネントをインスタンス化する場合は、1 つの ActiveX コンポーネントに対してのみ実行できます。ProgID を使用してインスタンスを作成すると、そのレジストリ ハイブを使用して対応する CLSID が決定され、そのクラスを実装する実行可能 DLL/OCX/EXE が使用されます。後者の場合、対応するレジストリ ハイブは次のようになります。

HKEY_CLASSES_ROOT\Wow6432Node\Clsid{6935DB93-21E8-4ccc-BEB9-9FE3C77A297A}\InProcServer32

この場合に実行できる最善の方法は、2 つの ActiveX コンポーネントに 2 つの異なる ProgID を使用することです。メイン クラスに同じソース コードを使用する場合でも、別々の ProgID を持つコンポーネントをコンパイルするために使用される 2 つの異なるプロジェクトでそれらを「そのまま」使用できます。すべての開発環境(おそらく使用しているVB6)でそれができるようです。

詳細については、次の記事を参照してください: http://www.vbaccelerator.com/progid.htm

ActiveX コンポーネントにも同じ問題がありましたが、私たちの経験から、異なる ProgID を持つことが最善の選択であることがわかりました。次のバージョンをリリースする場合でも、ProgID を変更してください。これにより、両方のバージョンを問題なく同じ OS に共存させることができ、開発者は既存のプロジェクトを段階的にアップグレードできます。

===

あなたの質問への回答として、ProgID を変更できない場合に問題を解決する方法を考えています。私が知っているように、CLSID を直接使用して ActiveX をアクティブ化することができます。開発環境が異なれば、そのためにさまざまな手法が使用されます。あなたのプロジェクトはありませんが、JavaScript を使用している場合は、次の記事のレシピを試すことができます。

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/08652e9e-7deb-40a3-8c1a-f9becdcbf56e/

簡単に言えば、次のような呼び出しを使用して ActiveX オブジェクトを作成する必要はありません。

myobject = new ActiveXObject("SAMPLEACTIVEX.sampleActiveXCtrl.1");

OBJECT タグを使用して 2 つの ActiveX コントロールをページに配置し、Web ページの名前 (ID) を使用してオブジェクトのメソッドを呼び出す必要があります。HTML OBJECT タグの例を見ると、次のようになります。

ご覧のとおり、指定した ID を使用して、まさに必要なオブジェクトのメンバーにアクセスできます。その多くの例はすでに SO にあります - ここにそれらの 1 つがあります:

javascript: ActiveX オブジェクトが呼び出されたときに「オブジェクトはこのプロパティまたはメソッドをサポートしていません」

于 2013-05-27T09:10:18.743 に答える