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);
...
だから、正確に一つの例は、これを行う方法のウェブ上ありますか?このことはどこに文書化されていますか?またはタイトルに大きな「COM」を入れた1000ページの本の1つを地元の図書館で掘り起こす必要がありますか? –
@HaiPhanこれは(私はこの答えを作ったとき、おそらく6年前のことでしたが)これに潜んでいたのでしばらくしていましたが、私はmsdnのドキュメントと一般的なWeb上のドキュメントが乏しいことを覚えています。私はそれが何か改善されたとは思っていません。特にCOMと関連していれば、これはかなり古い技術です。しかし、あなたがあなたのgoogle-fuを使って良い作品を見つけたら、あなたがここにリンクを掲示すれば誰かを助けると確信しています:) – TGasdf