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

わんくま同盟

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

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

ツリー一括表示

C#でCOMクライアントの実装。コールバックが呼ばれない /新田 (19/11/28(Thu) 12:48) #93215
Re[1]: C#でCOMクライアントの実装。コールバックが呼ばれない /新田 (19/11/28(Thu) 13:08) #93216
  └ Re[2]: C#でCOMクライアントの実装。コールバックが呼ばれない /とっちゃん (19/12/02(Mon) 10:27) #93282


親記事 / ▼[ 93216 ]
■93215 / 親階層)  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サーバーの情報が取得できています。


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

[ □ Tree ] 返信 編集キー/

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

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

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

▲[ 93216 ] / 返信無し
■93282 / 2階層)  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 を派生して作ったからだと思います。

[ 親 93215 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -