• 検索結果がありません。

コールバック関数

ドキュメント内 GPC-4161 (ページ 168-172)

第 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.

ドキュメント内 GPC-4161 (ページ 168-172)

関連したドキュメント