こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

コールバック関数 再び

またまた、お世話になります。前回、御回答頂き動作するようにはなったのですが、コールバックに入力があった時に、アプリケーションが終了してしまう現象がおきています。御教授お願いします。

C++で作られたDLLを利用。
装置との通信を行なう物で初期設定用と通信開始用の
関数があり、コールバック関数で、装置からの送信もある。このDLLを使った、他のアプリで動作確認は取れているのでDLL自体には問題ないと思われる。

関数説明
【初期設定用】
 initial(DWORD ip,LPNOTIFICATIONFUNC notificationFunc);

ip=相手先のipアドレス
notificationFunc=コールバック関数へのポインタ

コールバック関数
WINAPI *PNOTIFICATIONFUNC(
 DWORD id,
 BYTE bySet1,
 BYTE bySet2,
 BYTE *data,
 DWORD datasize);
以上の説明があり、現在下記のように宣言して使っています。
【初期設定用】
Declare Function MT_INITIALIZE Lib "TEST.dll" Alias "Initial" _
 (ByVal ip As Integer, ByVal notificationFunc As CallBack) As Boolean

Public Delegate Sub CallBack( _
 ByVal id As Integer, _
ByVal byset1 As Byte, _
ByVal byset2 As Byte, _
ByVal data As IntPtr, _
ByVal dataSize As Integer)

【コールバック関数】
Public Shared Sub notificationFunc( _
 ByVal id As Integer, _
ByVal byset1 As Byte, _
ByVal byset2 As Byte, _
ByVal data As IntPtr, _
ByVal dataSize As Integer )
  //データのバッファ処理
End Sub

投稿日時 - 2005-08-19 23:47:26

QNo.1591505

困ってます

質問者が選んだベストアンサー

>このDLLを使った、他のアプリで動作確認は取れているのでDLL自体には問題ない
そのアプリのコードは持っています?

考えるよりコンバートの方が、だいぶ手間がありません。


それができないなら、考えるしかないので、一応書きます。

[BYTE *data] => [ByVal data As IntPtr]
という変換をしていますよね。
「data」に渡すための変数値のアドレスをIntPtrオブジェクトに収め、値渡しをする事が前提の宣言をしています。
その形式を取っていなければ、メモリリークを起こして落ちると思います。

あなたが公開した情報でもできますが、要は使い方次第です。


個人的には、オブジェクトハンドルを意識しないでやりたいのであれば、
[ByRef data As Byte]
としたいところです。
http://okweb.jp/kotaeru.php3?q=1565958
↑ ここでやりましたよね。
その変換で、不都合があるのであれば、補足してください。



ちょっと気になったので追記です。
普通はDLLだけ提供している物に対し、インターフェイスだけの情報というのは考えずらいのですが、、、

各インターフェースのIN/OUTの解説文がありませんか?
私が記した方法は、あくまでマクロ的に「通す」だけのコンバート方法であり、目的を達する方法ではありません。

たとえばAPI:GetProfileString関数のヘルプ
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=GetProfileString+MSDN&num=50
DWORD GetProfileString(
 LPCTSTR lpAppName,    // セクション名
 LPCTSTR lpKeyName,    // キー名
 LPCTSTR lpDefault,    // 既定の文字列
 LPTSTR lpReturnedString, // 情報が格納されるバッファ
 DWORD nSize        // 情報バッファのサイズ
);
「//コメント」←これ結構大事です。

この情報の意味合いから、利用するたの最適な方法を考えてDeclareで宣言します。
http://okweb.jp/kotaeru.php3?q=1267832
このスレをよく読んでください。私の「お気に入り」です。


インターフェイスを作ることができても、利用する側の渡しでコケる場合もありますので、ご注意を!

投稿日時 - 2005-08-22 13:50:40

お礼

1050YENさん、度々ありがとうございます。
残念ながらコードはありません。
既存のDLLの利用です。

後の情報ですが、I/Oと、各変数の内容でしょうか…
とりあえず、もう少し試して見たいと思います。

投稿日時 - 2005-08-23 06:29:01

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

BYTE *data,

これ「String型」にしてあげたら、どうなります?

投稿日時 - 2005-08-23 12:02:57

お礼

1050YENさん、ありがとうございました。
とりあえず自己解決いたしました。


ちなみにString型にした場合は、
値渡しでは、
「'System.NullReferenceException' のハンドルされていない例外が 不明なモジュールです。 で発生しました。
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。」
が発生。
参照渡しでは、内容的に違うデータが入力されていました。

投稿日時 - 2005-08-29 09:56:10

あなたにオススメの質問