C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C#でCOMクライアントの実装。コールバックが呼ばれない

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■93215 / inTopicNo.1)  C#でCOMクライアントの実装。コールバックが呼ばれない
  
□投稿者/ 新田 (1回)-(2019/11/28(Thu) 12:48:50)

分類:[C#] 

C++で作られたdllがあります。

その中に下記の関数があります。
RegistCallBackClass(IClient client)

で、
インタフェース IClientをC#で継承して実装しました。

public class CClient: IClient
    {
        public void aaa(int iRow, int iCol, ref byte pData)
        {
            throw new NotImplementedException();
        }

        public void bbb(int iRow, int iCol, ref float pData)
        {
            throw new NotImplementedException();
        }

        public void ccc(int c_SizeWin, string pWindows)
        {
            throw new NotImplementedException();
        }

    }


で、
CClient cclient = new CClient();

RegistCallBackClass(cclient);

とやって、
コールバックを含むクラスのインスタンスを登録し、
aaa,bbb,cccが呼ばれるかどうか試しているのですが
全く呼ばれません。
該当するイベントは発生していると思われるのですが。。。


COMサーバーと通信するCOMクライアントを作成しており、
COMクライアントを作成する人のために
公開されたdllがあり
サーバーを server.exe /RegServerで登録し
regsvr32 client.dll
をやって
C#のフォームプロジェクトで参照の追加 COMでclient.dll(タイプライブラリ)
した状態です。

個人的にはIClientの実装方法に問題があるのではと思っているのですが
まったく分かりません!!!

dll内にある、コールバック以外の関数呼び出しは成功しており
COMサーバーの情報が取得できています。


何卒、ご教授よろしくお願いします。

引用返信 編集キー/
■93216 / inTopicNo.2)  Re[1]: C#でCOMクライアントの実装。コールバックが呼ばれない
□投稿者/ 新田 (2回)-(2019/11/28(Thu) 13:08:14)
・manage コードである C# の関数を、 unmanage コードである DLL から callback で呼ぶ
・callbackのポインタを渡すのではなく、callbackが記述してあるクラスのインスタンスを渡すようにdll内の関数が作られている

このあたりがポイントだと思うのですが
IClientの実装方法に何かポイントはありますか?
メソッドの並び順が重要だというのはググると出てきたので、そこは気を付けています。

インタフェースを継承する際に
メソッドを実装してなかったらVisual studioが自動で必要なメソッドを追加してくれるので
関数名や引数はその通りにしています。
引用返信 編集キー/
■93282 / inTopicNo.3)  Re[2]: C#でCOMクライアントの実装。コールバックが呼ばれない
□投稿者/ とっちゃん (651回)-(2019/12/02(Mon) 10:27:33)
No93216 (新田 さん) に返信
> ・manage コードである C# の関数を、 unmanage コードである DLL から callback で呼ぶ
> ・callbackのポインタを渡すのではなく、callbackが記述してあるクラスのインスタンスを渡すようにdll内の関数が作られている
>
> このあたりがポイントだと思うのですが
> IClientの実装方法に何かポイントはありますか?
> メソッドの並び順が重要だというのはググると出てきたので、そこは気を付けています。
>
C++ のプロジェクトは、どういう形式ですか? C++/CLI ですか?それとも通常の C++ですか?

インターフェースと呼んでいる IClient は、C++ ではどのように定義されていますか?
それを C# ではどのように定義しましたか?


一応。。。

C++ にはインターフェースという型は存在しません。

純粋仮想関数を並べて、呼び出し形式だけを定義したクラス(あるいは構造体)を
インターフェースと表現することはあります。
広義な意味でのインターフェースという部分に当たるため、C# や Java などの持つ
インターフェースという型とは異なるものです。


> インタフェースを継承する際に
> メソッドを実装してなかったらVisual studioが自動で必要なメソッドを追加してくれるので
> 関数名や引数はその通りにしています。

これは、あくまでも C# で定義した interface IClient を派生して作ったからだと思います。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ