2009-06-14 24 views
3

私は、ATLを使用してCOMコンポーネントを作成しようとしています。私はVBクライアントのイベントを発生させたいと思います。私は数多くのチュートリアルを見つけました。これらのチュートリアルはすべて細部に変化しているようですが、いずれも実用的なソリューションを生み出すことはできません。ATL接続ポイントが正常に動作しない

を(のVisual Studio 2008を使用して)::ここで私がやっているものです

  1. 新しいATL DLLプロジェクトを作成します。私はそれをATLEventTestと呼んだ。
  2. クラスビュー:右クリックしてATLEventTestをクリックし、新しいATLシンプルオブジェクトクラスを追加しました。 は、私はこのオブジェクトを使用して作成された
  3. ...など、IMyObjectCMyObjectを生成した、このMyObjectと呼ばれる: BスレA)アパートメント)集約 c)のデュアルインタフェース D) 電子ISupportErrorInfo)の接続ポイントを

  4. CProxy_IMyObjectEvents<T>をクリックし、「機能の追加」をクリック

  5. 機能はsomeEventという名前の空の戻り値の型のものである、とint testParamを取ります。
  6. リビルド。
    (この時点で、どこかの 'Implementing Connection Point'を見ることができるはずです。)
  7. 右クリックしてCMyObjectをクリックしてください。 '接続ポイントを追加'
  8. '_IMyObjectEvents'をリストに移動しました。
  9. 私の解決策でコード検索を行いました。どこでもsomeEventが見つかりません!
  10. someEvent機能を再度追加しました。今、それはATLEventTest_i.hにあります
  11. 私のコードでfire_someEvent(...)を呼び出すことができるはずですができません。

これは私がこのことをうまくやってくれているように私を駆り立てています。誰かが私が間違っていることを見ることができれば、私は訂正、ヒント、ハッキングなどの訂正、ヒント、ハッキングなどを感謝します。

この時点で、私はウィザードをねじ込み、 IDL直接、私は:(はるかに良い公平ではないかもしれない感じを持っている

+1

ATLなしでこれを行うことを個人的にお勧めします。ここでは、ActiveXコントロールとJavaScriptでこれを行う方法について書きました。インターフェースとコンセプトは本質的に同じです。 http://jeffcode.blogspot.com/2008/02/how-to-create-activex-control-that.html –

答えて

5

この場所で概説した方法を試してみてください:あなたは上記の与えている例名を持つ

Adding an Event (ATL) @ MSDN

を、中あなたのMyObject.idlファイルでは、dispinterface _IMyObjectEventsのセクションの下であっても、あなたのアウトバウンドの宣言が見えるはずです。 CProxy_IMyObjectEvents <T>を右クリックして、ライブラリの_IMyObjectEventsを右クリックしていないと、あなたのIDLに定義が不足している可能性があります。自動生成されたファイル_IMyObjectEvents_CP.hファイルはプロジェクトヘッダーファイルに存在する必要があり、メソッドを正しく追加した結果、Fire_someEvent()メソッドが含まれている必要があります。そうでない場合、代わりにsomeEvent()という名前のメソッドが作成されたことがわかります。

ここでは、テストプロジェクトで試すことができる概要を示します。

  1. 新しいATL DLLプロジェクトを作成します。私はそれをATLEventTest1と呼んだ。
  2. プロジェクトをビルドします。
  3. クラスビュー:ATLEventTest1を右クリックし、新しいATLシンプルオブジェクトクラスを追加します。それをMyObjectと呼んでください。
  4. a)アパートメントスレッディングb)デュアルインターフェイスc)接続ポイントなど必要なものを定義します。
  5. プロジェクトを再ビルドします。
  6. クラスビュー:ATLEventTest1Libライブラリを見つけ、_MyObjectEventsを右クリックし、[メソッドの追加]をクリックします。
  7. メソッドはvoidを返す型であり、someEventという名前であり、パラメータ属性[in]を持つint testParamをとります。
  8. パラメータを追加した結果、「[in] int testParam」が表示されます。
  9. [IDL属性]タブで、必要に応じてIDを変更します。 Finishをクリックします。
  10. クラスビュー:CMyObjectを右クリックし、[追加]をクリックして、[接続ポイントの実装]に移動します。
  11. _IMyObjectEventsを選択し、[>]をクリックして実装された接続ポイントリストに移動します。 Finishをクリックします。
  12. リビルド。
  13. 今、あなたのCMyObjectクラスでは、Fire_someEvent()を呼び出すことができます。 ATLEventTest1.idlファイルのdispinterface _IMyObjectEventsの下に新しいメソッドが表示されます。ヘッダーファイル_IMyObjectEvents_CP.hファイルが作成され、Fire_someEvent()のブロードキャストコードが作成されます。
+0

+1:私のために治療をしてください。ありがとう。 – Rob

+2

(Visual Studio 2012/2010/maybe2008のBUGのため)11.使用可能なタイプのlibrairesにデフォルトのEmbedded IDLアイテムを使用しないでください。プロジェクトのタイプライブラリを手動で選択する必要があります。 – Raymond

+1

レイモンドはどういう意味ですか? VS2012では、イベントインターフェイスを右クリックしてメソッドの追加を選択し、ウィザードを完了してもイベントはIDLに追加されません。しかし、「あなたは手動でプロジェクトのタイプライブラリを選択する必要がありますか?それをどこから選んでください! – Neutrino

1

クラスにはIProvideClassInfo/IProvideClassInfo2の実装がありますか?非制御オブジェクトを思い出した場合、VBはイベントソースインターフェイスを見つけるためにこれを必要とします。

はこのお試しください:

public IProvideClassInfo2Impl<&CLSID_MyClass NULL, &LIBID_ATLEventTest, 1, 0>, 

をして、インターフェース・マップ

COM_INTERFACE_ENTRY(IProvideClassInfo) 
COM_INTERFACE_ENTRY(IProvideClassInfo2) 
+0

IProvideClassInfo/IProvideClassInfo2はキーポイントです。私は数日を無駄にし、MSDNのチュートリアルコードと私のコードを比較した後、私はその違いを見つけました。 – Raymond

0

にたぶん、あなたはアパートメントスレッドに問題があります。 VBでコンソールアプリケーションを作成しますか? 古典的なメッセージポンプが正しく動作する必要があります(たとえば、従来のWindowsアプリケーション)。 COMオブジェクト(MTA)で異なるアパートメントモードを試してください。

0

だから新しいシステムを再構築した後、私はVisual Studio 2005とVisual Studio 2008の両方をインストールしました。2005年にこれを完全に動作させることができます。それでも私は2008年に仕事を得ることができません。私はちょうど私のATLのもののためにVS2005に取り組まなければならないように見える...

助けてくれたすべての人に再びありがとう。

0

私は同じ問題を抱えていました。 MSDNのドキュメントを保存してオンラインで検索しました。最後に、私はそれを理解した。

ウィザードが主にしていない主なことは、IDLファイルに宣言を入れることです。私は手動でそれを追加し、私のクラスでは、 "Fire_" theres。

希望すると、これが役立ちます。

0

コントロールから_I ***イベントリファレンスをすべて削除することで、同様の問題を修正できました。hファイル

関連する問題