構造体を使用する際、固定長データの場合と可変長データの場合でデータの扱い方が異なります。
■固定長データ
構造体(固定長)を扱う場合のサーバアプリケーションについて以下に示します。
なお、固定長の構造体とは、メンバに以下のデータを含まない構造体です。
文字列型
バイナリ
構造体
配列
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 = 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 ); } |
■可変長データ
構造体(可変長)を扱う場合のサーバアプリケーション例を以下に示します。
なお、可変長の構造体とは、メンバに以下のデータを含む構造体です。
文字列型
バイナリ
構造体
配列
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 = 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 ); } |