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

13.6.1 文字列データについて

文字列データを使用する際、ワイド文字としてデータを扱う場合には、必ず「unsigned short*」型で宣言してください。それ以外の場合には、「char*」型で宣言してください。

char*型

文字列データを扱う場合のサーバアプリケーションについて以下に示します。文字列データの終端には、必ずNULL文字(0x00)を設定してください。

IDLファイル定義例
module apfwmod {
    interface apfwinf {
        string server_apl(
             in string param_in,        /* INパラメタ */
             out string param_out,      /* OUTパラメタ */
             inout string param_inout   /* INOUTパラメタ */
        );
    };
};
サーバアプリケーションインタフェース定義例
char*
server_apl(
  char           *param_in,        /* INパラメタ */
  char           **param_out,      /* OUTパラメタ */
  char           **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ポインタ以外の場合、受け取ったデータサイズ以下のデータを設定する場合には文字列領域を初期化してそのまま使用します。また、受け取ったデータより大きいサイズのデータを設定する場合には文字列領域をapfw_c_free()で解放し、apfw_c_alloc()で新しい領域を獲得して使用します。

復帰

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

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

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

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

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

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

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

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

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

unsigned short*型

ワイド文字として文字列型を扱う場合のサーバアプリケーション例を以下に示します。文字列データの終端には必ずNULL文字(0x0000)を設定してください。なお、日本語コードを設定する場合には以下の点に注意してください。

IDLファイル定義例
module apfwmod {
    interface apfwinf {
        wstring server_apl(
             in wstring param_in,        /* INパラメタ */
             out wstring param_out,      /* OUTパラメタ */
             inout wstring param_inout   /* INOUTパラメタ */
        );
    };
};
サーバアプリケーションインタフェース定義例
unsigned short*
server_apl(
  unsigned short   *param_in,      /* INパラメタ */
  unsigned short   **param_out,    /* OUTパラメタ */
  unsigned short   **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ポインタ以外の場合、受け取ったデータサイズ以下のデータを設定する場合には文字列領域を初期化してそのまま使用します。また、受け取ったデータより大きいサイズのデータを設定する場合には文字列領域をapfw_c_free()で解放し、apfw_c_alloc()で新しい領域を獲得して使用します。

復帰

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

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

サーバアプリケーションの記述例(コード系がEUCの場合)
#include "apfwcom.h"
#include "apfw_cdr_lib.h"

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

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

/* OUTパラメタ */
  /* 3文字+終端文字分領域を獲得 */
  *param_out = apfw_c_alloc(sizeof(unsigned short) * 4); 
  if( *param_out == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  memset( *param_out, 0x00, sizeof(unsigned short)*4 );
  /* char*にキャストして日本語を設定する */
  strcpy((char*)*param_out, "日本語");

/* INOUTパラメタ */
  if( *param_inout != 0x0000 ){
    apfw_c_free(*param_inout);
  }
  /* 3文字+終端文字分領域を獲得 */
  *param_inout = apfw_c_alloc(sizeof(unsigned short) * 4 );
  if( *param_inout == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  memset( *param_inout, 0x00, sizeof(unsigned short) * 4 );
  /* char*にキャストして日本語を設定する */
  strcpy((char*)*param_inout, "日本語");

/* 復帰情報 */
  /* 3文字+終端文字分領域を獲得 */
  apfw_result = apfw_c_alloc( sizeof(unsigned short) * 4 );
  if( apfw_result == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  memset(apfw_result, 0x00, sizeof(unsigned short) * 4 );
  /* char*にキャストして日本語を設定する */
  strcpy((char*)apfw_result, "日本語");

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

  return( apfw_result );
}
サーバアプリケーションの記述例(コード系がUNICODEの場合)
#include "apfwcom.h"
#include "apfw_cdr_lib.h"

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

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

/* OUTパラメタ */
  /* 3文字+終端文字分領域を獲得 */
  *param_out = apfw_c_alloc(sizeof(unsigned short) * 4); 
  if( *param_out == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  memset( *param_out, 0x00, sizeof(unsigned short)*4 );
  /* UNICODEの値を1文字ずつ直接数値で設定します。 */
  (*param_out)[0] = 0x65e5;           /* "日" */
  (*param_out)[1] = 0x672c;           /* "本" */
  (*param_out)[2] = 0x8a9e;           /* "語" */
  (*param_out)[3] = 0x0000;           /* 終端子 */

/* INOUTパラメタ */
  if( *param_inout != 0x0000 ){
    apfw_c_free(*param_inout);
  }
  /* 3文字+終端文字分領域を獲得 */
  *param_inout = apfw_c_alloc(sizeof(unsigned short) * 4 );
  if( *param_inout == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  memset( *param_inout, 0x00, sizeof(unsigned short) * 4 );
  /* UNICODEの値を1文字ずつ直接数値で設定します。 */
  (*param_inout)[0] = 0x65e5;           /* "日" */
  (*param_inout)[1] = 0x672c;           /* "本" */
  (*param_inout)[2] = 0x8a9e;           /* "語" */
  (*param_inout)[3] = 0x0000;           /* 終端子 */

/* 復帰情報 */
  /* 3文字+終端文字分領域を獲得 */
  apfw_result = apfw_c_alloc( sizeof(unsigned short) * 4 );
  if( apfw_result == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  memset(apfw_result, 0x00, sizeof(unsigned short) * 4 );
  /* UNICODEの値を1文字ずつ直接数値で設定します。 */
  apfw_result[0] = 0x65e5;           /* "日" */
  apfw_result[1] = 0x672c;           /* "本" */
  apfw_result[2] = 0x8a9e;           /* "語" */
  apfw_result[3] = 0x0000;           /* 終端子 */

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

  return( apfw_result );
}