ユーザ出口プログラムの作成例

ユーザ出口プログラムの作成例を以下に示します。この作成例では、1レコード16バイトのイメージデータである入力ファイルをASCII文字列に変換し出力データとしています。

(1) Windowsの場合

a) userexit.cの内容

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/* USER_EXITINFO 構造体 */
typedef struct user_exitinfo {
  int            whereno;               /* 抽出条件番号 */
  int            outfileno;             /* 出力ファイル番号 */
  char           outitemname[255+1];    /* 出力項目名 */
  int            outitemno;             /* 出力項目番号 */
  char           outitemtype;           /* 定義項目タイプ */
  int            outitemsize;           /* 定義項目サイズ */
  char           outitemflg;            /* 定義小数部桁数 */
}USER_EXITINFO;
 
/* 項目番号に該当するデータを取得する関数 */
typedef int (__stdcall *PROC_ed_getindata_itemno)
         (void *ptr1, void *ptr2, int  itemno, char **getbuf, int  *getsize);
 
/* メモリを取得する関数 */
typedef void *(__stdcall *PROC_ed_malloc) (size_t size);
 
/* メモリを解放する関数 */
typedef void (__stdcall *PROC_ed_free)(void *ptr);
 
/* DLL エントリーポイント */
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved )
{
 switch (ul_reason_for_call){
         case DLL_PROCESS_ATTACH:
         case DLL_THREAD_ATTACH:
         case DLL_THREAD_DETACH:
         case DLL_PROCESS_DETACH:
              break;
}
    return TRUE;
}
 
/* 初期化関数 */
int __stdcall ed_userexit_init( short *dtlerrno )
{
  return 0;
}


/* メイン関数 */
int __stdcall ed_userexit_main( USER_EXITINFO *user_exitinfo,
                                        char     **outbuf,
                                        int      *outsize,
                                        short    *dtlerrno,
                                        void     *ptr1,
                                        void     *ptr2 )
{
/* データ取得用 */
char    *getbuf;
/* データサイズ格納用 */
int    getsize = 0;
/* モジュールハンドル格納用 */
HMODULE hModule;
/* 項目番号からデータを取得する関数 */
PROC_ed_getindata_itemno ed_getindata_itemno;
/* メモリ取得関数 */
PROC_ed_malloc ed_malloc;
/* メモリ解放関数 */
PROC_ed_free             ed_free;
 
/* 入力データ取得関数のロード */
hModule = GetModuleHandle(NULL);
ed_getindata_itemno = 
 (PROC_ed_getindata_itemno)GetProcAddress(hModule, "ed_getindata_itemno");
if( ed_getindata_itemno == NULL ){
        *dtlerrno = 1;
        return -1;
}
 
/* メモリ取得関数のロード */
ed_malloc = (PROC_ed_malloc)GetProcAddress(hModule, "ed_malloc");
if( ed_malloc == NULL ){
        *dtlerrno = 2;
        return -1;
}

/* メモリ解放関数のロード */
ed_free = (PROC_ed_free)GetProcAddress(hModule, "ed_free");
if( ed_free == NULL ){
        *dtlerrno = 3;
        return -1;
}
 
/* 項目番号1 のデータを取得 */
if( ed_getindata_itemno( ptr1, ptr2, 1, &getbuf, &getsize ) != 0 ){
        *dtlerrno = 4;
        return -1;
}
 
/* 出力用バッファをアロケート */
    *outbuf = (char *)ed_malloc( 64 );
if( *outbuf == (char *)NULL ){
        *dtlerrno = 5;
        return -1;
}
sprintf((char *)*outbuf, 
       "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
       (unsigned char)getbuf[0],(unsigned char)getbuf[1],
       (unsigned char)getbuf[2],(unsigned char)getbuf[3],
       (unsigned char)getbuf[4],(unsigned char)getbuf[5],
       (unsigned char)getbuf[6],(unsigned char)getbuf[7],
       (unsigned char)getbuf[8],(unsigned char)getbuf[9],
       (unsigned char)getbuf[10],(unsigned char)getbuf[11],
       (unsigned char)getbuf[12],(unsigned char)getbuf[13],
       (unsigned char)getbuf[14],(unsigned char)getbuf[15]);
*outsize=32;
 
/* 取得データ領域の解放 */
ed_free( getbuf );
 
return 0;
}
 
/* 終了関数 */
void __stdcall ed_userexit_end( void )
{
return;
}

b) userexit.defの内容

LIBRARY "userexit"

EXPORTS
ed_userexit_init @1
ed_userexit_main @2
ed_userexit_end  @3

(2) UNIXの場合

a) userexit.cの内容

#include <stdio.h>
#include <stdlib.h>
 
/* USER_EXITINFO 構造体 */
typedef struct user_exitinfo {
  int            whereno;               /* 抽出条件番号 */
  int            outfileno;             /* 出力ファイル番号 */
  char           outitemname[255+1];    /* 出力項目名 */
  int            outitemno;             /* 出力項目番号 */
  char           outitemtype;           /* 定義項目タイプ */
  int            outitemsize;           /* 定義項目サイズ */
  char           outitemflg;            /* 定義小数部桁数 */
} USER_EXITINFO;
 
/* 項目番号に該当するデータを取得する関数 */
int  *ed_getindata_itemno ( void *ptr1, void *ptr2, int  itemno,
                             char **getbuf, int  *getsize);
void *ed_malloc (size_t size);
void ed_free (void *ptr);
 
/* 初期化関数 */
int ed_userexit_init( short *dtlerrno )
{
  return 0;
}
 
/* メイン関数 */
int ed_userexit_main( USER_EXITINFO *user_exitinfo,
                                 char    **outbuf,
                                 int     *outsize,
                                 short   *dtlerrno,
                                 void    *ptr1,
                                 void    *ptr2 )
{
 char    *getbuf;        /* データ取得用 */
 int    getsize = 0;     /* データサイズ格納用 */

/* 項目番号1 のデータを取得 */
 if( ed_getindata_itemno( ptr1, ptr2, 1, &getbuf, &getsize ) != 0 ){
            *dtlerrno = 1;
            return -1;
 }
 
/* 出力用バッファをアロケート */
*outbuf = (char *)ed_malloc( 64 );
 if( *outbuf == (char *)NULL ){
        *dtlerrno = 2;
        return -1;
 }
 sprintf((char *)*outbuf,
          "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
          (unsigned char)getbuf[0],(unsigned char)getbuf[1],
          (unsigned char)getbuf[2],(unsigned char)getbuf[3],
          (unsigned char)getbuf[4],(unsigned char)getbuf[5],
          (unsigned char)getbuf[6],(unsigned char)getbuf[7],
          (unsigned char)getbuf[8],(unsigned char)getbuf[9],
          (unsigned char)getbuf[10],(unsigned char)getbuf[11],
          (unsigned char)getbuf[12],(unsigned char)getbuf[13],
          (unsigned char)getbuf[14],(unsigned char)getbuf[15]);
*outsize=32;
 
/* 取得データを解放 */
 ed_free( getbuf );
 
 return 0;
}
 
/* 終了関数 */
void ed_userexit_end( void )
{
 return;
}