またまた、お世話になります。前回、御回答頂き動作するようにはなったのですが、コールバックに入力があった時に、アプリケーションが終了してしまう現象がおきています。御教授お願いします。
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
No.1ベストアンサー
- 回答日時:
>この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 …
DWORD GetProfileString(
LPCTSTR lpAppName, // セクション名
LPCTSTR lpKeyName, // キー名
LPCTSTR lpDefault, // 既定の文字列
LPTSTR lpReturnedString, // 情報が格納されるバッファ
DWORD nSize // 情報バッファのサイズ
);
「//コメント」←これ結構大事です。
この情報の意味合いから、利用するたの最適な方法を考えてDeclareで宣言します。
http://okweb.jp/kotaeru.php3?q=1267832
このスレをよく読んでください。私の「お気に入り」です。
インターフェイスを作ることができても、利用する側の渡しでコケる場合もありますので、ご注意を!
1050YENさん、度々ありがとうございます。
残念ながらコードはありません。
既存のDLLの利用です。
後の情報ですが、I/Oと、各変数の内容でしょうか…
とりあえず、もう少し試して見たいと思います。
No.2
- 回答日時:
BYTE *data,
これ「String型」にしてあげたら、どうなります?
1050YENさん、ありがとうございました。
とりあえず自己解決いたしました。
ちなみにString型にした場合は、
値渡しでは、
「'System.NullReferenceException' のハンドルされていない例外が 不明なモジュールです。 で発生しました。
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。」
が発生。
参照渡しでは、内容的に違うデータが入力されていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) VBA シート上にドロップダウンリストを作り、予め指定値をセットしたいのですが 1 2023/03/25 15:15
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0 == False はいいけど
-
パワーポイントのVBAでテキスト...
-
Object型からDouble型へのキャスト
-
VBA 同じ名前のオブジェクトを...
-
VBAのWindowオブジェクトとWork...
-
多人数のじゃんけんプログラム
-
Vbで通常使用するプリンターを...
-
ワイルドカード<?>と型パラメー...
-
オブジェクト名をforループ内で...
-
ポップアップメニュー作成時に...
-
C#でフォームのオブジェクト名...
-
newは明示的にした方が良いのか?
-
Excelで =EMBED("Acrobat Docu...
-
Visual Studioでのbmpファイル...
-
application暗黙オブジェクトで...
-
access2002のリレーションシッ...
-
EXCEL VBAにて動的にCheckBOXを...
-
Listに格納されているオブジェ...
-
クラスとSTLコンテナについて
-
HP上のMIDIが聞けなくな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
JAVAからHTMLへ値を返す方法
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
Object型からDouble型へのキャスト
-
ビジュアルC++でボタンの有...
-
COMコンポーネントって何?
-
LISTBOXの内容が更新されま...
-
Vbで通常使用するプリンターを...
-
多人数のじゃんけんプログラム
-
オブジェクト名をforループ内で...
-
ASP.net 教えてください!!(...
-
JSPのout.printについて
-
時間帯判定をする。
-
error C2712: オブジェクト ア...
-
Accessの連結・非連結オブジェ...
おすすめ情報