ページの先頭行へ戻る
Interstage Business Application Server アプリケーション開発ガイド
FUJITSU Software

13.6.2 構造体について

構造体を使用する際、固定長データの場合と可変長データの場合でデータの扱い方が異なります。

固定長データ

構造体(固定長)を扱う場合のサーバアプリケーションについて以下に示します。
なお、固定長の構造体とは、メンバに以下のデータを含まない構造体です。

IDLファイル定義例
struct server_fix{
        long para1;
        long para2;
};
module apfwmod {
    interface apfwinf {
        server_fix server_apl(
             in server_fix param_in,        /* INパラメタ */
             out server_fix param_out,      /* OUTパラメタ */
             inout server_fix param_inout   /* INOUTパラメタ */
        );
    };
};
サーバアプリケーションインタフェース定義例
typedef struct{
  int    para1;
  int    para2;
}server_fix;

server_fix
server_apl(
  server_fix     *param_in,        /* INパラメタ */
  server_fix     **param_out,      /* OUTパラメタ */
  server_fix     **param_inout,    /* INOUTパラメタ */
  int            *rtn,             /* 処理結果情報 */
  apfwExcept     *apfw_env );      /* 例外情報 */
パラメタの扱い

パラメタ

アプリケーション連携実行基盤から
渡されたパラメタ

アプリケーション連携実行基盤へ
渡すパラメタ

IN

  • 使用しないパラメタの場合
    NULLポインタとして渡されます。

  • 使用するパラメタの場合
    構造体領域のアドレスが渡されます。構造体領域はC言語実行基盤インタフェースで自動的に獲得、および解放されます。

OUT

NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    パラメタには何も設定せず、NULLポインタのまま返却します。

  • データを設定する場合
    構造体領域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスをパラメタに設定して返却します。
    なお、獲得した構造体領域はC言語実行基盤インタフェースで自動的に解放されます。

INOUT

  • 使用しないパラメタの場合
    NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    渡されたパラメタがNULLポインタの場合、パラメタには何も設定せず、NULLポインタのまま返却します。
    渡されたパラメタがNULLポインタ以外の場合、構造体領域をapfw_c_free()で解放後、パラメタにNULLポインタを設定して返却してください。

  • 使用するパラメタの場合
    構造体領域のアドレスを値として持つ変数のアドレスが渡されます。構造体領域はC言語実行基盤インタフェースで自動的に獲得、および解放されますが、必要に応じてアプリケーションで解放することもできます。

  • データを設定する場合
    渡されたパラメタがNULLポインタの場合、構造体領域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスはパラメタに設定して返却します。なお、獲得した構造体領域はC言語実行基盤インタフェースで自動的に解放されます。
    渡されたパラメタがNULLポインタ以外の場合、渡された領域をそのまま使用してください。

復帰

  • データの設定を省略する場合
    関数の復帰値としてNULLを返却します。

  • データを設定する場合
    構造体領域をapfw_c_alloc()で獲得して使用します。
    獲得した領域のアドレスを関数の復帰値として返却します。なお、獲得した構造体領域はC言語実行基盤インタフェースで自動的に解放されます。

サーバアプリケーションの記述例
#include "apfwcom.h"
#include "apfw_cdr_lib.h"

#include "XXXXXX.h" /* 実行基盤インタフェース生成ツールより生成されるヘッダファイル */

server_fix*
server_apl(
  server_fix     *param_in,        /* INパラメタ */
  server_fix     **param_out,      /* OUTパラメタ */
  server_fix     **param_inout,    /* INOUTパラメタ */
  int            *rtn,             /* 処理結果情報 */
  apfwExcept     *apfw_env )       /* 例外情報 */
{
  server_fix     *apfw_result = NULL; /* アプリケーションの復帰値 */

/* OUTパラメタ */
  *param_out = apfw_c_alloc(sizeof(server_fix));
  if( *param_out == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  (*param_out)->para1 = 1;
  (*param_out)->para2 = 2;

/* INOUTパラメタ */
  if( *param_inout == NULL ){
    *param_inout = apfw_c_alloc(sizeof(server_fix));
    if(*param_inout == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
      return( NULL );
    }
  }
  (*param_inout)->para1 = 1;
  (*param_inout)->para2 = 2;

/* 復帰情報 */
  apfw_result = apfw_c_alloc(sizeof(server_fix));
  if( apfw_result == NULL ){
    *rtn = APFW_RTN_ERROR;	/* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  apfw_result->para1 = 1;
  apfw_result->para2 = 2;

  *rtn = APFW_RTN_COMMIT;   /* 処理結果情報に正常(APFW_RTN_COMMIT)を設定 */

  return( apfw_result );
}

可変長データ

構造体(可変長)を扱う場合のサーバアプリケーション例を以下に示します。
なお、可変長の構造体とは、メンバに以下のデータを含む構造体です。

IDLファイル定義例
struct server_var{
        long para1;
        string para2;
};
module apfwmod {
    interface apfwinf {
        server_var server_apl(
             in server_var param_in,        /* INパラメタ */
             out server_var param_out,      /* OUTパラメタ */
             inout server_var param_inout   /* INOUTパラメタ */
        );
    };
};
サーバアプリケーションインタフェース定義例
typedef struct{
  int     para1;
  char*   para2;
}server_var;

server_var*
server_apl(
  server_var     *param_in,        /* INパラメタ */
  server_var     **param_out,      /* OUTパラメタ */
  server_var     **param_inout,    /* INOUTパラメタ */
  int            *rtn,             /* 処理結果情報 */
  apfwExcept     *apfw_env );      /* 例外情報 */
パラメタの扱い

パラメタ

アプリケーション連携実行基盤から
渡されたパラメタ

アプリケーション連携実行基盤へ
渡すパラメタ

IN

  • 使用しないパラメタの場合
    NULLポインタとして渡されます。

  • 使用するパラメタの場合
    構造体領域のアドレスが渡されます。構造体領域はC言語実行基盤インタフェースで自動的に獲得、および解放されます。

OUT

NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    パラメタには何も設定せず、NULLポインタのまま返却します。

  • データを設定する場合
    構造体領域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスをパラメタに設定して返却します。
    なお、獲得した構造体領域はC言語実行基盤インタフェースで自動的に解放されます。

INOUT

  • 使用しないパラメタの場合
    NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    渡されたパラメタの値がNULLポインタの場合、パラメタには何も設定せず、NULLポインタのまま返却します。
    渡されたパラメタの値がNULLポインタ以外の場合、パラメタの構造体領域をapfw_c_free()で解放後、パラメタにNULLポインタを設定して返却してください。

  • 使用するパラメタの場合
    構造体領域のアドレスを値として持つ変数のアドレスが渡されます。構造体領域はC言語実行基盤インタフェースで自動的に獲得、および解放されますが、必要に応じてアプリケーションで解放することもできます。

  • データを設定する場合
    渡された領域がNULLポインタの場合、構造体領域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスはパラメタに設定して返却します。なお、獲得した構造体領域はC言語実行基盤インタフェースで自動的に解放されます。
    渡された領域がNULLポインタ以外の場合、渡された領域をそのまま使用します。

復帰

  • データの設定を省略する場合
    関数の復帰値としてNULLを返却します。

  • データを設定する場合
    構造体領域をapfw_c_alloc()で獲得して使用します。
    獲得した領域のアドレスを関数の復帰値として返却します。なお、獲得した構造体領域はC言語実行基盤インタフェースで自動的に解放されます。

サーバアプリケーションの記述例
#include "apfwcom.h"
#include "apfw_cdr_lib.h"

#include "XXXXXX.h" /* 実行基盤インタフェース生成ツールより生成されるヘッダファイル */

server_var*
server_apl(
  server_var     *param_in,         /* INパラメタ */
  server_var     **param_out,       /* OUTパラメタ */
  server_var     **param_inout,     /* INOUTパラメタ */
  int            *rtn,              /* 処理結果情報 */
  apfwExcept     *apfw_env )        /* 例外情報 */
{
  server_var       *apfw_result = NULL;   /* アプリケーションの復帰値 */

/* OUTパラメタ */
  *param_out = apfw_c_alloc(sizeof(server_var));
  if( *param_out == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  (*param_out)->para1 = 1;
  (*param_out)->para2 = apfw_c_alloc(10);
  if( (*param_out)->para2 == NULL){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  strcpy((*param_out)->para2, "OUT DATA");

/* INOUTパラメタ */
  if( *param_inout != NULL ){
    apfw_c_free((*param_inout)->para2);
  }
  else{
    *param_inout = apfw_c_alloc(sizeof(server_var));
    if( *param_inout == NULL ){
      *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
      apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
      return( NULL );
    }
  }
  (*param_inout)->para1 = 1;
  (*param_inout)->para2 = apfw_c_alloc(10);
  if( (*param_inout)->para2 == NULL){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  strcpy((*param_inout)->para2, "IO DATA");

/* 復帰情報 */
  apfw_result = apfw_c_alloc(sizeof(server_var));
  if( apfw_result == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  apfw_result->para1 = 1;
  apfw_result->para2 = apfw_c_alloc(10);
  if( apfw_result->para2 == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  strcpy( apfw_result->para2, "PROC END" );
  *rtn = APFW_RTN_COMMIT;   /* 処理結果情報に正常(APFW_RTN_COMMIT)を設定 */
return( apfw_result );
}