Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere データベース・ツール・インタフェース » データベース・ツール・インタフェース » データベース・ツール・インタフェースの使い方

 

コールバック関数の使い方

DBTools 構造体には MSG_CALLBACK 型の要素がいくつかあります。それらはコールバック関数へのポインタです。

コールバック関数の使用

コールバック関数を使用すると、DBTools 関数はオペレーションの制御をユーザの呼び出し側アプリケーションに戻すことができます。DBTools ライブラリはコールバック関数を使用して、DBTools 関数から、次の 4 つの目的を持ってユーザに送られたメッセージを処理します。

  • 確認   ユーザがアクションを確認する必要がある場合に呼び出されます。たとえば、バックアップ・ディレクトリが存在しない場合、ツール・ライブラリはディレクトリを作成する必要があるか確認を求めます。

  • エラー・メッセージ   オペレーション中にディスク領域が足りなくなった場合など、エラーが発生したときにメッセージを処理するために呼び出されます。

  • 情報メッセージ   ツールがユーザにメッセージを表示するときに呼び出されます (アンロード中の現在のテーブル名など)。

  • ステータス情報   ツールがオペレーションのステータス (テーブルのアンロード処理の進捗率など) を表示するときに呼び出されます。

コールバック関数の構造体への割り当て

コールバック・ルーチンを構造体に直接割り当てることができます。次の文は、バックアップ構造体を使用した例です。

backup_info.errorrtn = (MSG_CALLBACK) MyFunction

MSG_CALLBACK は、SQL Anywhere に付属する dllapi.h ヘッダ・ファイルに定義されています。ツール・ルーチンは、呼び出し側アプリケーションにメッセージを付けてコールバックできます。このメッセージは、ウィンドウ環境でも、文字ベースのシステムの標準出力でも、またはそれ以外のユーザ・インタフェースであっても、適切なユーザ・インタフェースに表示されます。

確認コールバック関数の例

次の確認ルーチンの例では、YES または NO をプロンプトに答えるようユーザに求め、ユーザの選択結果を戻します。

extern short _callback ConfirmRtn(
        char * question )
{
    int ret = IDNO;
    if( question != NULL ) {
        ret = MessageBox( HwndParent, question,
        "Confirm", MB_ICONEXCLAMATION|MB_YESNO );
    }
    return( ret == IDYES );
}
エラー・コールバック関数の例

次はエラー・メッセージ処理ルーチンの例です。エラー・メッセージをウィンドウに表示します。

extern short _callback ErrorRtn(
        char * errorstr )
{
    if( errorstr != NULL ) {
        MessageBox( HwndParent, errorstr, "Backup Error", MB_ICONSTOP|MB_OK );
    }
    return( 0 );
}
メッセージ・コールバック関数の例

メッセージ・コールバック関数の一般的な実装では、メッセージを画面に表示します。

extern short _callback MessageRtn(
        char * messagestr )
{
    if( messagestr != NULL ) {
                    OutputMessageToWindow( messagestr );
    }
    return( 0 );
}
ステータス・コールバック関数の例

ステータス・コールバック・ルーチンは、ツールがオペレーションのステータス (テーブルのアンロード処理の進捗率など) を表示する必要がある場合に呼び出されます。一般的な実装では、メッセージを画面に表示するだけです。

extern short _callback StatusRtn(
        char * statusstr )
{
    if( statusstr != NULL ) {
        OutputMessageToWindow( statusstr );
    return( 0 );
}