10

COM dll を作成してから何年も経ちました。いくつかの COM インターフェイスから継承するいくつかのクラスを作成しましたが、それをテストしたいと思います。GUID をどこかに配置してから regsvr32 に登録する必要があることはわかっていますが、どのような手順が必要ですか?

編集: 申し訳ありませんが、私は C++ を使用していることを忘れていました。

4

3 に答える 3

12

新しいATLCOMプロジェクトを作成するには、次の手順に従います。

  1. ファイル/新規プロジェクト
  2. Visual C ++ / ATL/ATLプロジェクト
  3. 設定をカスタマイズし、完了したら終了を押します

新しいdllを作成しましたが、空です。COMオブジェクトを追加するには、次のようにします。

  1. プロジェクト/クラスの追加
  2. Visual C ++ / ATL / ATLの単純なオブジェクト、追加を押します
  3. 必要な名前(MyObjectなど)を付け、[完了]を押して追加します

オブジェクトにインターフェースを実装させたい場合

  1. クラスビューで、オブジェクトクラス(CMyObject)を選択します
  2. 右クリック/追加/インターフェースの実装...
  3. 実装するインターフェースを選択できます
    1. プロジェクトファイルにすでにある.idlファイルから
    2. タイプライブラリが埋め込まれている.tlb/.dll/.exeから
    3. すでに登録されているオブジェクトから
  4. 完了したらプレスフィニッシュ

PS:別のフォルダーに同じ名前の新しいATLプロジェクトを作成し、カスタマイズしたファイルを追加する方がはるかに簡単です。ウィザードはいくつかのタスクを実行し、いくつかのカスタマイズされたファイルを作成します。

ファイルごとに追加するのが難しい大きなプロジェクトの場合も同じようにしますが、新しいプロジェクトにファイルを追加する代わりに、新しいプロジェクトから古いプロジェクトに設定をコピーし、ウィザードが作成したファイルを追加します。 stdafx.hなどのヘッダーを修正して、新しい設定をマージします。

PPS:dllでMFCをサポートする場合は、ATLプロジェクトを選択する代わりに、MFC /MFCDllを選択する必要があります。ATL Simple Objectを追加すると、ウィザードはプロジェクトにATLサポートを追加するように要求します。

于 2009-01-21T20:37:45.080 に答える
4

DllGetClassObjectという関数を作成してエクスポートする必要があります。その関数は、「クラス ファクトリ」の割り当てを担当します。これも作成する必要があり、COM オブジェクトのインスタンスを割り当てることができます。IClassFactoryを実装する必要があります。

難しいことではありません。別の方法は、理論的にはこれを行うATL(xhanttの回答を参照)を使用することですが、実際にはそれは本当に混乱です。どういうわけか、さらに複雑な抽象化レイヤー内に COM の複雑さをカプセル化することに成功しています。たとえば、DLL 間でオブジェクトを移動しようとして頑張ってください。

ただし、ATL ウィザードを実行して、 を宣言する方法の例を確認することもできますDllGetClassObject。実装IClassFactoryは非常に簡単です。オブジェクトをニュースアップする 1 つのメソッドだけです。

次に、DLL を登録する必要があります。つまり、キーをレジストリに入れます。このregsvr32ツールは、ユーザーの支援がなければこれを行うことができません。DllRegisterServerと呼ばれる別の関数を作成してエクスポートする必要があります。これがすべての面倒な作業を行います。regsvr32DLL をロードし、検索してDllRegisterServer呼び出すだけです。

繰り返しますが、ATL にはこれを実装する方法がありますが、DLL のリソースに埋め込まれた .rgs ファイルに格納されたレジストリ変更命令でいっぱいの一種のスクリプトを読み取ることによって実行します。このファイルに何らかの構文エラーを誤って入力すると、登録は警告なしで失敗します。

繰り返しになりますが、実際には、数行のコードを記述してレジストリを微調整する方が簡単であることに気付くかもしれません。詳細はこちら

代わりに C# を使用した場合、これらの問題は発生しません。すべてが非常にきれいにカプセル化されています。COM オブジェクトを開発するためのツールとしては、実際には C++ よりもはるかに優れています。

于 2009-01-24T21:54:34.907 に答える
1

ソリューションをビルドすると、dll が自動的に登録されます。また、_i.c と .h ファイルの 2 つのファイルが作成されます。

dll をテストするには、サンプル アプリケーションを作成します。

  1. サンプル Win32 アプリケーションを作成します。main 関数を持つ win32 アプリケーションの cpp ファイルに _i.c と .h を含めます。

  2. CoInitialize() を呼び出します。

  3. インターフェイス ポインター CComPtr pMyInterface = NULL を宣言します。// _i.c で IMyInterface が宣言されている場所

  4. インスタンス pMyInterface.CoCreateInstance(CLSID_MyClass) を作成します。// CLSID_MyClass は CoClass を表す GUID
    です

  5. インターフェイスに存在する API を呼び出す

  6. CoUnInitialize(); を呼び出します。

于 2009-01-21T15:46:27.727 に答える