Visual Basic .NET 使用時の注意点

関数仕様

Win32API形式
※ユニバーサル Windows プラットフォーム (UWP) には対応しておりません

 

関数引数、戻り値

各関数の引数、戻り値の内容は開発言語に依存せず共通です。
詳細は関数リファレンスをご参照下さい。

 

コールバック関数使用時の注意点

Visual Basic .NETでは、コールバック関数によるイベントの通知を行う場合、コールバック関数のメモリアドレスを固定するための処理を追加する必要があります。

これらの処理のために必要なコード例を、以下に示します。
詳細はサンプルプログラムを参照してください。

■グローバル変数として宣言します。

Dim gCh As GCHandle
Dim pdelegate_func As PLOGGEREVENTCALLBACK
Dim pfunc As IntPtr

■Loadメソッドの中で割り込み処理用デリゲートを初期化し、ガベージコレクションにより破棄されないように参照を追加。

pdelegate_func = New PLOGGEREVENTCALLBACK(AddressOf CallBackProc)
gCh = GCHandle.Alloc(pdelegate_func)

■Closedメソッドの中でハンドルを開放します。

gCh.Free()

■関数の固定ポインタを取得します。

pfunc = Marshal.GetFunctionPointerForDelegate(pdelegate_func)

■LoggerSetNotifyEventでは取得した固定ポインタを指定します。

Ret = LoggerSetNotifyEvent(Id, pfunc, CType(LOGGER_PARAM_EVENT_DATANUM, UInteger), Nothing)

 

 

文字列変数をByte配列へ変換する

LoggerSetChannelSetting()関数の第5引き数ChannelNameはByte配列です。
このため、Visual Basic .NETの文字列変数を、そのままChannelName引き数として利用することはできません。

文字列変数をByte配列へ変換するのために必要なコード例を、以下に示します。
詳細はサンプルプログラムを参照してください。

■Byte配列、および、Encodingクラスを宣言します。

Dim ChannelName(255) As Byte
Dim Enc As Encoding

Encodingクラスの詳細は、Microsoft社のWebサイトを参照ください。

System.Text.Encodingクラス: https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding

 

■コード ページ識別子"shift_jis"を指定し、文字列"Channel 0"をByte配列に変換します。

Enc = System.Text.Encoding.GetEncoding("shift_jis")
ChannelName = Enc.GetBytes("Channel 0")

GetEncodingメソッド、GetBytesメソッドの詳細は、Microsoft社のWebサイトを参照ください。

Encoding.GetEncodingメソッド:https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding.getencoding
Encoding.GetBytesメソッド:https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding.getbytes
コード ページ識別子:https://learn.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers

 

Byte配列を文字列変数へ変換する

LoggerGetChannelSetting()関数の第5引き数ChannelNameはByte配列です。
このため、ChannelName変数を、そのままVisual Basic .NETの文字列変数として利用することができません。

Byte配列を文字列変数ChNameへ変換するのために必要なコード例を、以下に示します。
詳細はサンプルプログラムを参照してください。

■文字列変数、および、エンコードクラスを宣言します。

Dim ChName As String
Dim Enc As Encoding

エンコードクラスの詳細は、Microsoft社のWebサイトを参照ください。

System.Text.Encodingクラス: https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding

 

■Byte配列ChannelNameの先頭から終端文字"\0"までを検索し、有効な文字数Lengthを取得します。

Dim SearchByte As Byte = 0
Dim Length As Integer

Length = Array.IndexOf(ChannelName, SearchByte)

 

Arrayクラス、および、IndexOfメソッドの詳細は、Microsoft社のWebサイトを参照ください。

System.Arrayクラス:https://learn.microsoft.com/ja-jp/dotnet/api/system.array
Array.IndexOfメソッド:https://learn.microsoft.com/ja-jp/dotnet/api/system.array.indexof

 

■コード ページ識別子"shift_jis"を指定し、Byte配列ChannelNameを文字列変数ChNameへ変換します。

Enc = System.Text.Encoding.GetEncoding("shift_jis")

ChName = Enc.GetString(ChannelName, 0, Length)

GetEncodingメソッド、および、GetStringメソッドの詳細は、Microsoft社のWebサイトを参照ください。

Encoding.GetEncodingメソッド:https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding.getencoding
Encoding.GetStringメソッド:https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding.getstring
コード ページ識別子:https://learn.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers