2009-07-06 11 views
4

C#で既存のC++イベントシンクのイベントソースとして機能するマネージライブラリを作成しようとしています。私が抱えている問題は、アンマネージドアプリケーションがAtlAdviseを呼び出してライブラリの接続ポイントマップを取得したときに、エラー "0x80040200"(CONNECT_E_NOCONNECTION)が発生していることです。このエラーに関するMSDNの記事は、 < - >管理されていない通信とCOMサーバーの無効な接続ポイントマップですが、管理対象COMサーバーについては何も表示されません。管理対象イベントソースをアンマネージイベントシンクに接続する

私が動作し、露出し、その後、次の操作を行って、自分のコードでは、同じイベントを作成しているイベントのリストを持っているアンマネージC++サーバーからIDLをアップロードしました:

含むDLLを作成しましたインターフェイスは、私が実装する必要が

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIDispatch), Guid("xxxxxx")] 
public interface IMyInterface 
{ 
    ... 
    methods here 
    ... 
3つの必要なインタフェース

[Guid("xxxxxxx2")] 
[ComSourceInterfaces(typeof(IMyInterface), typeof(IMyOtherInterface), typeof(IMyThirdInterface))] 
public class DeviceTranslator : IDisposable, IMyInterface, IMyOtherInterface, IMyThirdInterface 
{ 

作成delegを実装するクラスを持っている

作成したDLL管理インタフェース

namespace myNS.Interfaces 
{ 
    public delegate void DistributeMessage([In] ref OLDMESSAGE Message); 

と私はイベントを実施し、実際のIMyInterfaceというのイベント私のクラスで

event DistributeMessage myDistributeMessage; 

を作成したの名前空間でのATE: 公開イベントDistributeMessage myDistributeMessage。

私はコンストラクタに配置することができますが、dllが適切にロードされることを確認してください。このアンマネージコードが呼び出されると、上記のエラーが発生します。(pDistributeSinkはIUnknownにキャストされたCEventSinkです。 IID_IDistributeEventのためのGUID IMyInterfaceという同じGUIDである)私は完全に私の頭を悩まだし、AtlAdviseが戻っCLRからの接続ポイントマップを取得する必要があり、他に何を理解していないこの時点で

hr = AtlAdvise(m_pUnknown, pDistributeSink, IID_IDistributeEvent, &m_dwConnectionPointCookie); 

...

答えて

4

私は毎日私の車輪を回転させて5日間待っていましたが、 e、そして1時間後に私はそれを理解しました。

は、ここで私は(codeprojectに多くのおかげで)

私が発信イベントインターフェイス(IMyInterfaceという)から継承し、私のClassInterface属性の中でそれを定義したをしなければならなかったものです。私はまた、中DeviceTranslatorのクラスが含まれている名前空間ではありません名前空間IMyInterfaceという内デリゲートを作成していた

それは私が必要なことが判明:。ONLY ClassInterface属性でこれを定める

  • とその インターフェイス内のメソッドを無効にしないでください( )。

  • が という名前が付けられたクラス DeviceTranslator内のイベントを作成(COMイベント シンククライアントのメソッドに一致する)正確IMyInterfaceという の メソッドのシグネチャに一致する私のクラス ライブラリの名前空間内のデリゲートを作成します。 IMyInterfaceと全く同じです

非常に説明されています私は上に掲載されたリンクの中で、本当にすべてが実際にどのように動作しているのか、そしてどこで作成されなければならないのかを真に捉えた最初の場所でした。

3

私はこれが正しいCodeProjectのリンクであると考えている:http://www.codeproject.com/KB/COM/cominterop.aspx#NetEvents

+0

だから、正確に一つの例は、これを行う方法のウェブ上ありますか?このことはどこに文書化されていますか?またはタイトルに大きな「COM」を入れた1000ページの本の1つを地元の図書館で掘り起こす必要がありますか? –

+1

@HaiPhanこれは(私はこの答えを作ったとき、おそらく6年前のことでしたが)これに潜んでいたのでしばらくしていましたが、私はmsdnのドキュメントと一般的なWeb上のドキュメントが乏しいことを覚えています。私はそれが何か改善されたとは思っていません。特にCOMと関連していれば、これはかなり古い技術です。しかし、あなたがあなたのgoogle-fuを使って良い作品を見つけたら、あなたがここにリンクを掲示すれば誰かを助けると確信しています:) – TGasdf

関連する問題