11

DllRegisterServer が呼び出されたときに実行されるコードを記述する必要があります。つまり、誰かが電話したとき:

regsvr32 myActiveX.ocx

必要なレジストリ エントリの最終的なリストを見つけようとしています (レジストリを調べてまとめられるものではなく)。

これまでのところ、私の遠征で次のことがわかりました。

HKEY_CLASSES_ROOT
   \MyCoolLibrary.MyCoolControl
      \Clsid
         (default) = "{myClassId}"
   \CLSID
      \{myClassId}
         \Control
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \MiscStatus
            \1
               (default) = 205201
         \ProgID
            (default) = "MyCoolLibrary.MyCoolControl"
         \ToolboxBitmap32
            (default) = "c:\foo\myActiveX.ocx,1"
         \TypeLib
            (default) = "{myTypeLibraryGuid}"
         \Verb
            \0
               (default) = "Properties,0,2"
         \Version
            (default) = "1.0"
   \TypeLib
      \{myTypeLibraryGuid}
         \1.0
            (default) = "MyCoolLibrary.MyCoolControl"

さて、懸念事項: - Control フォルダには何が含まれていますか? その存在はコントロールを示していますか?- 205201 の MiscStatus は何をしますか? 代わりに 205202 は何をしますか? - "Properties,0,2" という動詞は何ですか? "Properties,0,0" と "Properties,0,1" はどこにありますか?

言い換えれば、私はドキュメントを探しています。

4

7 に答える 7

14

私がこれまでに知っていること。COM はclsidに基づいてオブジェクトを作成します。これは、そのクラスを一意に識別する GUID です。

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}

次に、そのクラスを使用してオブジェクトを作成します。COM は、その COM オブジェクトを保持する DLL がどこにあるかを知る必要があります。私の特定のケースでは、COM オブジェクトを公開する「サーバー」は DLL であり、「処理中」になります。次に、以下を追加して、COM をその「インプロセス」DLL にポイントします。

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"

COM は、COM サーバー オブジェクトがサポートするスレッド モデルも認識する必要があります。最も単純で最も一般的で、この例で使用されているのは、「アパートメント」スレッド モデルです。

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"

次は ProgID です。これは、DNS を使用してフレンドリ名を IP に変換する方法に似ています。ここでは、フレンドリ名"MyCoolLibrary.MyCoolControl"を醜い clsid に変換します。"{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

今、誰かが求めることができます

MyCoolLibrary.MyCoolControl

COMはそれをClassIDに変換できます

{AE8530CF-D204-4877-9CAB-F052BF1F661F}

COM がクラス ID を取得すると、その下のレジストリHKCR\Clsid\{AE8530CF-D204-4877-9CAB-F052BF1F661F}を調べて実際の情報を見つけることができます。

楽しみのために、ProgID が Clsid セクションに追加されています。これは、人々がこのクラスが何であるかを理解できるようにするためです。

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \ProgID
             (default) = "MyCoolLibrary.MyCoolControl"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

次はタイプライブラリです。これはインプロセスではほとんど重要ではありませんが、COM オブジェクトが別の「アパートメント」にある場合は、関数パラメーターをマーシャリングする必要があります。すべてのクラス メソッドを定義するタイプ ライブラリがある場合、COM はこれを自動的に行います。

clsid セクションは、TypeLib キーを追加して、適切なタイプ ライブラリを指しています。

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \ProgID
             (default) = "MyCoolLibrary.MyCoolControl"
         \TypeLib            
             (default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

このタイプ ライブラリに関する情報はレジストリにも保存されますが、これらのキーの追加は、RegisterTypeLibへの呼び出しによって行われます。ただし、次のようなキーが追加されます。

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \ProgID
             (default) = "MyCoolLibrary.MyCoolControl"
         \TypeLib            
             (default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"
HKEY_CLASSES_ROOT
    \TypeLib
        \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
           \1.0
              (default) = "My Cool ActiveX Library"
           ...

ここで、うまくいけばActiveX コントロールを機能させるために必要なトリッキーな内容に入ります。

MSDN の記事では、ダミーのプログラマブルキーを追加して、それが ActiveX コントロールであることを示す必要があると記載されています。

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \Programmable

しかし、この MSDN ライブラリ ページでは、キーワードはControlであり、Programmableではなく、Programmable キーはありません。

しかし、一部の ActiveX は Control を使用し、一部は Programmable を使用し、一部は両方を使用しています。

他に必要なものについて言及しているものが見つかりません。

それで、誰かが決定的なドキュメントを見つけることができますか?

于 2008-11-12T19:33:05.237 に答える
5

Larry Osterman が適切な出発点を提供しています。

これの「カーゴ カルト」の性質の大部分は、COM オブジェクトに設定できる一連のレジストリ設定が当惑するほどあるという事実です。そこで、何を設定する必要があるかを判断するのに役立つ一連の記事を作成しようとしています。

-- COM オブジェクトを登録するために必要なレジストリ エントリ。

要約: オブジェクトを使用する必要があるシナリオによって異なります。最も基本的で絶対に必要な設定は、デフォルト値と の ThreadingModel ですHKEY_CLASSES_ROOT\CLSID\<clsid>\が、ほとんどの場合、ProgID と AppID も必要になります。

于 2008-11-12T17:07:15.203 に答える
5

Kraig Brockenschmidt による Inside OLE 2 のコピーを検索/借用/盗みます。それは世界のように古いです(そして私もデートします:-))

また、上記のレジストリ エントリの概要も示します。

その他のヒントについては、 Larry Osterman のブログ投稿をお読みください。

MSDN ActiveXサンプルを見てください。

また、コントロールが実装するすべてのカスタム インターフェイスとイベント インターフェイスの HKCR\Interfaces の下にエントリがありません。

于 2008-11-12T17:12:58.997 に答える
3

すべてを網羅しているわけではありませんが、このMS ナレッジ ベースの記事を試してください。

また、Larry Ostermanの有益なブログ投稿がここにあります


別の方法として、 RegMonなどのツールを使用して、DllRegisterServer メソッドが呼び出されたときに行われるレジストリの変更を直接監視する方法があると思います。

于 2008-11-12T17:09:12.640 に答える
0

実験的にどのキーが作成されるかを確認したい場合の注意点: Sysinternals のProcess Monitorを使用すると、コントロールを登録するときにレジストリのアクティビティがリアルタイムでキャプチャされます。

于 2008-11-12T17:58:49.200 に答える
0

ぜひ、Larry Osterman の記事をリンクしてください。

さらに、MSVC ATL COM オブジェクト ウィザードによって生成された ATL レジストラー スクリプトを出発点として使用することをお勧めします。さまざまなオプションを試して、それらが出力にどのように影響するかを確認できます。

于 2008-11-12T17:10:26.957 に答える
-1

64ビットOSで作業していますか?


その場合、 HKEY_CLASSES_ROOT\CLSID\に書き込む代わりに、 HKEY_CLASSES_ROOT\Wow6432Node\CLSID\
に書き込む必要があります。

于 2013-03-19T12:39:52.690 に答える