第 7 章 リファレンス(汎用DIO部)
7.3 コールバック関数
※Visual Basicでコールバック機能を使用する場合、幾つかの制約事項が発生します(後述の『7.3.2 Visual Basic使用時の制約事項』をご参照下さい)。
7.3.1 SdioSetEvent 関数により設定されるコールバック関数 SdioSetEvent
関数にて登録し、STB信号の割り込み発生、通信モジュール異常時の割り込み発生した時にコー ルされるコールバックルーチンです。
【記述】
コールバックルーチンを使用する場合、下記のように記述します。
(下記はコールバックルーチンを CallBackProc とする場合の例です。)
●C 言語
void CALLBACK CallBackProc(DWORD EventLogic, DWORD UserData) {
// 割り込みイベントに対応する処理を記述します }
コールバックルーチンの関数型 LPSDIOCALLBACK は下記のように定義されます。
#define SDIOCALLBACK CALLBACK
typedef void (SDIOCALLBACK *LPSDIOCALLBACK)(DWORD EventLogic, DWORD UserData);
●C 言語(x64)
void CALLBACK CallBackProc(DWORD EventLogic, PVOID UserData) {
// 割り込みイベントに対応する処理を記述します }
コールバックルーチンの関数型 LPSDIOCALLBACK は下記のように定義されます。
#define SDIOCALLBACK CALLBACK
typedef void (SDIOCALLBACK *LPSDIOCALLBACK)(DWORD EventLogic, PVOID UserData);
●Visual Basic
Function CallBackProc(EventLogic As Long, UserData As Long) ‘ 割り込みイベントに対応する処理を記述します
End Function
コールバックルーチンはSdioSetEvent
関数の呼び出しを行うプロジェクト内の標準モジュールの中に記述しなければなりません。
SdioSetEvent
関数の引数パラメータでプロシージャのアドレスを渡す為にAddressOf演算子を使用します。
(SdioSetEvent
関数の使用例を参照してください。)AddressOf 演算子を使うと、プロシージャからの戻り値で は な く 、 プ ロ シ ー ジ ャ 自 体 の ア ド レ ス が 、 ダ イ ナ ミ ッ ク リ ン ク ラ イ ブ ラ リ (DLL) の SdioSetEvent
関数に渡されます。
●Delphi
procedure CallBackProc(EventLogic:DWORD; UserData:DWORD); stdcall;
begin
// 割り込みイベントに対応する処理を記述します end;
●Visual C# .NET // コールバック関数
void CallBackProc(uint EventLogic, IntPtr UserData){
// 割り込み処理を記述します …
}
// メインルーチン uint Ret;
IntPtr DeviceHandle;
IFCSDIO_ANY.PSDIOCALLBACK proc = new IFCSDIO_ANY.PSDIOCALLBACK(CallBackProc);
DeviceHandle = IFCSDIO_ANY.SdioOpen(“IFSDIO1”);
…
Ret = IFCSDIO_ANY.SdioSetEvent(DeviceHandle, IntPtr.Zero, 0, IntPtr.Zero, proc, new IntPtr(100));
Ret = IFCSDIO_ANY.SdioSetEventLogic(DeviceHandle, IFCSDIO_ANY.IFSDIO_FALL_EDGE);
© 2002, 2016 Interface Corporation. All rights reserved.
●Visual Basic .NET
Public proc As IFCSDIO_ANY.PSDIOCALLBACK
‘ コールバック関数
Public Sub CallBackProc(ByVal EventLogic As Integer, ByVal UserData As IntPtr) ‘ 割り込み処理を記述します
… End Sub
‘ メインルーチン Dim Ret As Integer
Dim DeviceHandle As IntPtr
proc = New IFCSDIO_ANY.PSDIOCALLBACK(AddressOf CallBackProc) DeviceHandle = IFCSDIO_ANY.SdioOpen(“IFSDIO1”)
…
Ret = IFCSDIO_ANY.SdioSetEvent(DeviceHandle, IntPtr.Zero, 0, IntPtr.Zero, proc, _ new IntPtr(100)) Ret = IFCSDIO_ANY.SdioSetEventLogic(DeviceHandle, IFCSDIO_ANY.IFSDIO_FALL_EDGE)
【パラメータ】
EventLogic
コールバック関数を呼び出した STB 信号の割り込み発生論理です。
割り込み論理は以下の識別子で格納されます。
IFSDIO_RISE_EDGE STB 信号の立ち上がりで割り込みが発生しました。
IFSDIO_FALL_EDGE STB 信号の立ち下がりで割り込みが発生しました。
IFSDIO_CONNECT_EVENT 通信モジュールとの切断で割り込みが発生しました。
IFSDIO_POWER_EVENT 通信モジュールの電源電圧異常で割り込みが発生しました。
UserData
SdioSetEvent
関数で指定したユーザデータです。
【戻り値】
コールバックルーチンに戻り値はありません。
7.3.2 Visual Basic 使用時の制約事項
Visual Basic Ver. 4.0 では、コールバック関数の登録ができない(AddressOf 演算子がサポート されない)為、イベント機能を使用することはできません。Visual Basic Ver. 5.0 以降は可能で す。
Microsoft Visual Basic 6.0 上で弊社ソフトウェアライブラリが提供する関数コールバック機能 を使用した場合、下記のアプリケーションエラーが発生する場合があります。
「“0x660d64d0”の命令が“0x0000009c”のメモリを参照しました。メモリが“written”になること はできませんでした。」
※”0x660d64d0”は異なる場合があります
アプリケーションエラーは下記の条件で発生します。
〇登録したコールバック関数内で、下記の関数、ステートメントをコールする。
・関数コール(弊社ソフトウェアライブラリが提供する関数含む)
・Visual Basic のステートメント(Str()など)
・スタティックテキストへの文字列代入など
また、この問題は、Visual Basic 6.0 の Learning、Professional、Enterprise Edition のすべて に当てはまり、サービスパックの適用有無にかかわらず発生します。
コールバック関数内で、アプリケーションエラーを発生させる処理を行わずに別の機能を利用する ことで目的の処理が実行できるように設計を変更してください。
Microsoft Visual Basic 6.0 は、スレッディング モデルとして、アパートメント モデルを採用 しています。
Microsoft Visual Basic 6.0 が作成、起動したスレッド以外からコールバック関数が実行された 場合にアプリケーションエラーが発生する場合があります。
弊社ソフトウェアライブラリでは、ライブラリ内で起動した別のスレッドから登録されたコールバ ック関数の実行を行いますので、この問題が発生します。
© 2002, 2016 Interface Corporation. All rights reserved.