3

ATL を使用して COM コンポーネントを作成しようとしており、VB クライアントのイベントを発生させたいと考えています。多数のチュートリアルを見つけましたが、それらはすべて詳細が異なるようであり、実用的なソリューションを生成するものはありません。これが私がやっていることです:

(Visual Studio 2008 を使用):

  1. 新しい ATL DLL プロジェクトを作成します。私はそれを呼んだATLEventTest
  2. クラス ビュー: を右クリックしATLEventTest、新しい ATL シンプル オブジェクト クラスを追加しました。これを と呼び、 、 などMyObjectを生成しました...CMyObjectIMyObject
  3. このオブジェクトは以下で作成されました: a) アパートメント スレッディング b) アグリゲーション c) デュアル インターフェイス d) ISupportErrorInfo e) 接続ポイント

  4. を右クリックしCProxy_IMyObjectEvents<T>、「関数の追加」をクリックしました

  5. 関数の戻り値の型は void で、名前someEventは で、引数はint testParam.
  6. 再構築します。
    (この時点で、どこかに「Implement Connection Point」が表示されるはずです。表示されません...)
  7. を右クリックしましたCMyObject。「接続ポイントを追加」
  8. _IMyObjectEvents' ' をリストに移動しました。
  9. 私のソリューションでコード検索を行いました。someEventどこにも見つからない!
  10. someEvent機能を再度追加しました。現在は、ATLEventTest_i.h にあります。
  11. fire_someEvent(...)私のコードを呼び出すことができるはずですが、できません。

これは、これを機能させようとして私を狂気に駆り立てています。誰かが私が間違っていることを見ることができれば、修正、ヒント、ハックなどをいただければ幸いです。

この時点で、私はウィザードを台無しにして、c++ と idl を直接変更しようとしているだけだと言いたくなりますが、それはそれほど良いことではないかもしれないと感じています :(

4

6 に答える 6

1

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

これを試して:

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

そしてインターフェースマップで

COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
于 2009-06-14T23:39:24.800 に答える
0

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

于 2009-06-15T22:18:51.990 に答える
0

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

于 2014-06-27T19:50:57.660 に答える
0

Ok。そのため、新しいシステムを再構築した後、Visual Studio 2005 と Visual Studio 2008 の両方をインストールしました。これは 2005 で完全に機能します。2008 年にはまだ機能していません。ATL 用に VS2005 で作業する必要があるようです...

助けてくれたすべての人にもう一度感謝します。

于 2009-07-01T01:36:41.773 に答える