- ベストアンサー
コールバック関数 再び
- C++で作られたDLLを利用し、コールバック関数が終了してしまう現象についての質問です。
- DLL自体は問題ないと思われるが、コールバック関数での装置からの送信時に終了してしまいます。
- 質問者はDLLを使う際に、初期設定用の関数と通信開始用の関数を利用しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>この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 このスレをよく読んでください。私の「お気に入り」です。 インターフェイスを作ることができても、利用する側の渡しでコケる場合もありますので、ご注意を!
その他の回答 (1)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
BYTE *data, これ「String型」にしてあげたら、どうなります?
お礼
1050YENさん、ありがとうございました。 とりあえず自己解決いたしました。 ちなみにString型にした場合は、 値渡しでは、 「'System.NullReferenceException' のハンドルされていない例外が 不明なモジュールです。 で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。」 が発生。 参照渡しでは、内容的に違うデータが入力されていました。
お礼
1050YENさん、度々ありがとうございます。 残念ながらコードはありません。 既存のDLLの利用です。 後の情報ですが、I/Oと、各変数の内容でしょうか… とりあえず、もう少し試して見たいと思います。