構造体を使用する際、固定長データの場合と可変長データの場合でデータの扱い方が異なります。
■固定長データ
構造体(固定長)を扱う場合のサーバアプリケーションについて以下に示します。
なお、固定長の構造体とは、メンバに以下のデータを含まない構造体です。
文字列型
バイナリ
構造体
配列
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 |
| - |
| ||
OUT | NULLポインタを値として持つ変数のアドレスが渡されます。 |
|
| ||
INOUT |
|
|
|
| |
復帰 | - |
|
|
#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 = malloc(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 = malloc(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 = malloc(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 );
} |
■可変長データ
構造体(可変長)を扱う場合のサーバアプリケーション例を以下に示します。
なお、可変長の構造体とは、メンバに以下のデータを含む構造体です。
文字列型
バイナリ
構造体
配列
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 |
| - |
| ||
OUT | NULLポインタを値として持つ変数のアドレスが渡されます。 |
|
| ||
INOUT |
|
|
|
| |
復帰 | - |
|
|
#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 = malloc(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 = malloc(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 ){
free((*param_inout)->para2);
}
else{
*param_inout = malloc(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 = malloc(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 = malloc(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 = malloc(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 ); } |