Hitachi

PRINT DATA EXCHANGE for Open


9.3.5 UOCコーディング例

後処理UOCのコーディング例を次に示します。

〈この項の構成〉

(1) Windowsアプリケーションの場合

この例では,変換で使用したスプールデータを使用して,再度ジョブコメントで指定した環境設定名で変換します。

#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <string.h>
#define  MSMAIN "C:\\Program Files\\HITACHI\\PDE for Open\\BIN\\msmain.exe"
int WINAPI WinMain(
    HINSTANCE       hInstance,
    HINSTANCE       hPrevInstance,
    LPSTR           lpCmdLine,
    int             nCmdShow
)
{
/*local areas*********************************************************/
    char    *infile;        /* input spool file name                 */
    char    *outfile;       /* output spool file name                */
    char    *cmtbuf;        /* JCL comment area buffer               */
    char     cmtarea[65];   /* JCL comment area                      */
    int      i;             /* work loop counter                     */
    int      j;             /* work counter                          */
    int      cmdL;          /* command line length                   */
    DWORD        ExitCode;              /* exit code                 */
    PROCESS_INFORMATION procInfo;       /* process information       */
    STARTUPINFO  stInfo;    /* process startup information           */
    BYTE         CallCmdLine[512];      /* command line for call proc*/
    DWORD        Event;                 /* process wait event code   */
    DWORD        rc;                    /* win32 last error code     */
/*process start*******************************************************/
    cmdL = lstrlen(lpCmdLine);
    infile = outfile = cmtbuf = NULL;
    memset(cmtarea, '\0', sizeof(cmtarea));
    /* input file name get */
    for (i = 0; i < cmdL; i++)
    {
        if ('"' == lpCmdLine[i])
        {
            if (NULL == infile)
                infile = &lpCmdLine[i + 1];
            else
            {
                lpCmdLine[i] = '\0';
                break;
            }
        }
    }
    /* output file name get */
    for ( ; i < cmdL; i++)
    {
        if ('"' == lpCmdLine[i])
        {
            if (NULL == outfile)
                outfile = &lpCmdLine[i + 1];
            else
            {
                lpCmdLine[i] = '\0';
                break;
            }
        }
    }
    /* JCL comment area get */
    for ( ; i < cmdL; i++)
    {
        if ('\\' == lpCmdLine[i])
        {
            i++;
        }
        else if ('"' == lpCmdLine[i] )
        {
            if (NULL == cmtbuf)
                cmtbuf = &lpCmdLine[i + 1];
            else
            {
                lpCmdLine[i] = '\0';
                break;
            }
        }
    }
    for (i = 0, j = 0; i < lstrlen(cmtbuf); i++) {
        if ('\\' == cmtbuf[i])
         {
            i++;
        }
        cmtarea[j++] = cmtbuf[i];
    }
        if (!*cmtarea)
    {
        ExitProcess(1);
    }
    /* UOC Start */
    /* コマンドライン組み立て: msmain.exe 入力ファイル名, 環境設定名*/
    sprintf(CallCmdLine, "\"%s\" %s,%s", MSMAIN, infile, cmtarea);
    memset(&stInfo, '\0', sizeof(STARTUPINFO));
    stInfo.cb = sizeof(STARTUPINFO);
    if (!CreateProcess(MSMAIN, CallCmdLine, NULL, NULL,
                       FALSE, CREATE_NEW_PROCESS_GROUP, NULL,
                       NULL, &stInfo, &procInfo))
    {
        rc = GetLastError();
        ExitProcess(rc);
    }
    GetExitCodeProcess(procInfo.hProcess, &ExitCode);
    while (ExitCode == STILL_ACTIVE)
    {
        Event = WaitForSingleObject(procInfo.hProcess, INFINITE);
        if (WAIT_TIMEOUT != Event &&
            WAIT_ABANDONED != Event)
        {
            GetExitCodeProcess(procInfo.hProcess, &ExitCode);
        }
    }
    CloseHandle(procInfo.hProcess);
    if (ExitCode == 0)
    {
        ExitProcess(1);
    }
    else if (ExitCode != 1)
    {
        ExitProcess(ExitCode);
    }
    ExitProcess(1);
}

(2) スクリプトの場合

この例では,変換で使用したスプールデータを使用して「C:\Hitachi\PDESample.txt」に変換時刻(環境変数_PDE_TIME)を出力し,戻り値0で終了します。

    @echo off
 
    rem 出力されるファイル名を環境変数にセット
    set OutputFileName=C:\\Hitachi\\PDESample.txt
 
    rem 環境変数 _PDE_TIMEをファイルに出力
    echo %_PDE_TIME% >> %OutputFileName%
 
    rem 戻り値を返す
    exit 0
    Option Explicit
    
    'ファイルオブジェクトの生成
    Dim FileObj
    Dim FilePt
    set FileObj = CreateObject("Scripting.FileSystemObject")
    set FilePt = FileObj.CreateTextFile("C:\\Hitachi\\PDESample.txt") '出力ファイル名
    
    '環境変数 _PDE_TIMEをファイルに出力
    Dim WshObj
    set WshObj = CreateObject("WScript.Shell")
    FilePt.Write("TIME : ")
    Dim Env
    set Env = WshObj.Environment("PROCESS")
    FilePt.WriteLine(Env("_PDE_TIME"))
    
    '後処理
    FilePt.Close()
    set FilePt = Nothing
    set FileObj = Nothing
    
    '戻り値を返す
    WScript.quit(0)
    //ファイルオブジェクトの生成
    var FileObj;
    var FilePt;
    FileObj = new ActiveXObject("Scripting.FileSystemObject");
    FilePt = FileObj.OpenTextFile("C:\\Hitachi\\PDESample.txt", 2, -2);
    
    //環境変数 _PDE_HOSTIDをファイルに出力
    var WshObj = new ActiveXObject("WScript.Shell");
    FilePt.Write("TIME : ");
    var Env = WshObj.Environment("PROCESS");
    FilePt.WriteLine(Env("_PDE_TIME"));
    
    //後処理
    FilePt.Close();
    FilePt = null;
    FileObj = null;
    
    //戻り値を返す
    WScript.quit(0);