dポイントプレゼントキャンペーン実施中!

お世話になります。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=相手のコードの格納アドレス


以上

全体的にどう宣言したら良いのか解りません。
(特にコールバック関数の宣言と、ポインタへの引数の渡し方)
すみませんが、御教授お願いします。

A 回答 (5件)

以下はあくまでサンプルです。


[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 …
    • good
    • 0
この回答へのお礼

1050YENさん、的確な回答ありがとうございます。
動かすことが出来ました。どうもポインタに引き当てるのを難しく考えすぎてたようです。
 追加で質問をお願いしたいのですが、下のような場合、文字列を関数のポインタ(data)に引き当てるにはどうしたら良いでしょうか?

TEST(
   DOWRD id
   BYTE  *data
  );

よろしくお願いします。

お礼日時:2005/08/09 23:35

1バイトだけでなく、複数バイトが渡るのならば、APIの受けはchar*になっているのかな?




dim bytData as byte

dim bytData() as byte
にして
bytCode = System.Text.Encoding.Unicode.GetBytes("文字列" & vbNullChar)
Call TEST(strID,bytData(0))
で渡りませんか?

(かなり自信がないですが、、)
    • good
    • 0
この回答へのお礼

1050YEN さん。

お付き合いありがとうございました。
大変参考になりました。
また機会がありましたら、よろしくお願いします。

お礼日時:2005/08/12 22:28

>文字列を送りたい場合はどうなるんでしょうか?


複数の文字単語ということですか?

VB6なら、領域を宣言しないバイト配列に文字列をつっこんで、配列の先頭を渡すだけなのですが、、、

.NETでやったことないですが、後で実験してみます。
たぶんエンコーディングするのかな?
    • good
    • 0

新たに質問来ましたね^^;


何となくの推測で書くので、はずしていたらすいません

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))


っていう感じだと思います。

この回答への補足

文字列を送りたい場合はどうなるんでしょうか?

補足日時:2005/08/10 23:00
    • good
    • 0

すいません。


ミスりました。

[DWORD id]
[DWORD datasize]
に該当する部分をintegerにしておいてください^^;;

でも先ほど述べたように、さらに型を変更する必要があるかもしれません。

今回の「integerにしておいてください」というのは、VB6感覚で書いてしまったためです^^;;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!