![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
お世話になります。VB.NETにてソフト制作をしています。
今回、DLLの関数を利用する事になりましたが、うまく宣言できず困っています。御教授お願いします。
DLLはC++で作られており変更できません。
DLLは通信を補助するための物で、初期設定の関数と通信開始の物があります。
初期設定用を呼んだ後、通信開始を行なうようです。
説明には下記のような内容がありました。
【初期設定用】
initial(DWORD ip,
LPNOTIFICATIONFUNC notificationFunc);
ip=相手先のipアドレス
notificationFunc=コールバック関数へのポインタ
コールバック関数
WINAPI *PNOTIFICATIONFUNC(
DWORD id,
BYTE bySet1,
BYTE bySet2,
BYTE bySet3,
BYTE *data,
DWORD datasize
);
【通信開始用】
start(DWORD ip
BYTE *code
);
ip=通信元のipアドレス
code=相手のコードの格納アドレス
以上
全体的にどう宣言したら良いのか解りません。
(特にコールバック関数の宣言と、ポインタへの引数の渡し方)
すみませんが、御教授お願いします。
No.1ベストアンサー
- 回答日時:
以下はあくまでサンプルです。
[DWORD id]
[DWORD datasize]
に該当する部分をLongで切っていますが、場合によっては型を変更する必要があります。
.NETでのコールバックのサンプルとしてだけと思ってください。
このサンプルは標準モジュールにコールバック関数を書いた場合用です。
もしクラスに書くのであれば、コールバック関数を
Public Function PNOTIFICATIONFUNC
から
Public Shared Function PNOTIFICATIONFUNC
としてください。
'APIのコールバックする関数の型をここで宣言する
'下のコールバック関数<PNOTIFICATIONFUNC>の宣言とセットになります。
Public Delegate Function CallBackFuncPNOTIFICATIONFUNC( _
ByVal id As Long, _
ByVal bySet1 As Byte, _
ByVal bySet2 As Byte, _
ByVal bySet3 As Byte, _
ByRef data As Byte, _
ByVal datasize As Long _
) As Boolean
Module Module1
'APIの宣言
Private Declare Sub initial Lib "DLL名" _
( _
ByVal ip As String, _
ByVal lpFunc As CallBackFuncPNOTIFICATIONFUNC _
)
Private Declare Sub start Lib "DLL名" _
( _
ByVal ip As String, _
ByRef code As Byte _
)
'実行
Public Sub Main()
Dim strIP As String
Dim bytCode As String
strIP = "192.168.0.1"
Call initial(strIP, AddressOf PNOTIFICATIONFUNC)
Call start(strIP, bytCode)
End Sub
'コールバック関数
Public Function PNOTIFICATIONFUNC( _
ByVal id As Long, _
ByVal bySet1 As Byte, _
ByVal bySet2 As Byte, _
ByVal bySet3 As Byte, _
ByRef data As Byte, _
ByVal datasize As Long _
) As Boolean
'サンプルは戻り値がBooleanになっていますが、そちらがかかれている情報だけでは、
'これが有効かどうかわかりません。
'ただ、よくコールバックを利用したDLLの作りとして、コールバックの最後の値まで行く前に、
'ステータスをFALSEで返すと、コールバック中断処理が働くものが多いように思ったので、
'勝手にBooleanを利用しています。
End Function
End Module
参考URL:http://www.microsoft.com/japan/msdn/library/defa …
1050YENさん、的確な回答ありがとうございます。
動かすことが出来ました。どうもポインタに引き当てるのを難しく考えすぎてたようです。
追加で質問をお願いしたいのですが、下のような場合、文字列を関数のポインタ(data)に引き当てるにはどうしたら良いでしょうか?
TEST(
DOWRD id
BYTE *data
);
よろしくお願いします。
No.5
- 回答日時:
1バイトだけでなく、複数バイトが渡るのならば、APIの受けはchar*になっているのかな?
dim bytData as byte
を
dim bytData() as byte
にして
bytCode = System.Text.Encoding.Unicode.GetBytes("文字列" & vbNullChar)
Call TEST(strID,bytData(0))
で渡りませんか?
(かなり自信がないですが、、)
1050YEN さん。
お付き合いありがとうございました。
大変参考になりました。
また機会がありましたら、よろしくお願いします。
No.4
- 回答日時:
>文字列を送りたい場合はどうなるんでしょうか?
複数の文字単語ということですか?
VB6なら、領域を宣言しないバイト配列に文字列をつっこんで、配列の先頭を渡すだけなのですが、、、
.NETでやったことないですが、後で実験してみます。
たぶんエンコーディングするのかな?
No.3
- 回答日時:
新たに質問来ましたね^^;
何となくの推測で書くので、はずしていたらすいません
BYTE* => unsinged char *
と考えて、半角1バイトの文字のやりとりが行われるのですよね?
であれば、文字コードを使えばできると思います。
-------------------------
TEST(
DOWRD id
BYTE *data
);
-------------------------
↓↓↓↓↓↓↓↓↓
'宣言
Private Declare Sub TEST Lib "DLL名" _
( _
ByVal id As String, _
ByRef data As Byte _
)
'メイン
dim strID as string = "ああ" '初期値
dim bytData as byte
'bytDataに、文字値を渡す必要がある時
bytCode = Asc("a")
'実行
Call TEST(strID,bytData)
'bytDataの文字値を読む時
msgbox(Chr(bytData))
っていう感じだと思います。
No.2
- 回答日時:
すいません。
ミスりました。
[DWORD id]
[DWORD datasize]
に該当する部分をintegerにしておいてください^^;;
でも先ほど述べたように、さらに型を変更する必要があるかもしれません。
今回の「integerにしておいてください」というのは、VB6感覚で書いてしまったためです^^;;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- ネットワーク 一台のサーバーに複数個のIPアドレスを追加出来る事は知っていますが、具体的にどうやるのでしょうか? 4 2022/11/03 20:12
- Evernote Facebookで本垢と別に複数のアカウントをつくりたいのですが、サブ垢が垢バンになって以降、IPア 1 2022/08/19 22:22
- Oracle ビットで表せる数値について 3 2022/09/12 16:37
- その他(プログラミング・Web制作) このプログラミング誰か教えてくれませんか 4 2022/04/29 15:56
- VPN 無料のwifiはなぜ危険性高い? VPN プライベートDNSモードにすれば安全? 2 2022/06/04 18:23
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Windows 10 (続き2)2つのウィンドウ選択時の表示について 3 2023/08/21 22:41
- 固定IP スマホやPCのIPアドレスについて教えてください。 5 2023/07/07 19:53
- FTTH・光回線 グローバルIPアドレスの変更について 1 2022/04/23 05:32
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
_tcscpy_s(wcscpy_s)の第二引数...
-
Shift_JIS(16進)を文字に変換す...
-
VB6.0でのバイナリデータの扱い...
-
C++で入力した文字列から数字を...
-
C#でstringをポインタとして渡す
-
nullと""、\\0とEOFの違いにつ...
-
TCL言語で文字列検索方法を教え...
-
c#で他のアプリの文字入力フォ...
-
#include <stdio.h> #include <...
-
VBA-DLLの引数受け渡しについて
-
構造体→文字列→構造体 をする方法
-
C言語で、ワイド文字の表示がう...
-
%dなどの違い
-
数字の入った配列をファイルへ...
-
WSH(VBS)でJSONの文字列を読み...
-
プログラミング C言語 意味がわ...
-
c言語によって文字列を逆順する...
-
char型配列の最大要素数
-
Integer変数をカラにしたいので...
-
関数から配列を返すには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムによく出てくるst...
-
nullと""、\\0とEOFの違いにつ...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
C++で入力した文字列から数字を...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
16進数を2文字ずつ配列に格納し...
-
シリアル通信で0x00を送信した...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
構造体→文字列→構造体 をする方法
-
VBA-DLLの引数受け渡しについて
-
[C++]WCHARの1文字目しか表示で...
-
VB6.0でのバイナリデータの扱い...
-
数字の入った配列をファイルへ...
-
引用符と二重引用符
-
こんなことって可能なのですか...
-
C言語の課題で困っています;
-
Shift_JIS(16進)を文字に変換す...
-
char型配列の最大要素数
おすすめ情報