帳票システム構築支援 uCosminexus EUR uCosminexus EUR サーバ帳票出力

[目次][索引][前へ][次へ]

3.6.7 Windows環境でC言語のプログラムからコマンド実行する場合

C言語のプログラムでエラーメッセージIDを取得する例を出力別に示します。

このプログラム例は,eurpsコマンドの標準エラー(メッセージ文)を,パイプを使って取得します。取得したメッセージ文を解析してメッセージIDを取得します。

<この項の構成>
(1) プリンタ出力のコーディング例
(2) PDF形式ファイル出力のコーディング例
(3) EUR形式ファイル出力のコーディング例
(4) CSV形式ファイル出力のコーディング例
(5) Excel形式ファイル出力のコーディング例

(1) プリンタ出力のコーディング例

#include<windows.h>
#include<stdio.h>
    
void main(int argc,char *argv[])
{
  HANDLE hRead,hWrite;
  SECURITY_ATTRIBUTES saAttr;
  DWORD dwRead;
  char sbuf[4096];
  STARTUPINFO          si;
  PROCESS_INFORMATION   pi;
  BOOL                 bRtn;
  CHAR                 szCmdLine[2048];
  DWORD                dwRC;
  CHAR                 szExePath[_MAX_PATH];
    
  /* eurps.exeのフルパス */
  strcpy(szExePath, "c:\\program files\\hitachi\\eur print service\\program\\eurps.exe");
    
      saAttr.nLength=sizeof(SECURITY_ATTRIBUTES);
      saAttr.bInheritHandle=TRUE;
      saAttr.lpSecurityDescriptor=NULL;
    
  bRtn=CreatePipe(&hRead,&hWrite,&saAttr,0);
  if (bRtn !=TRUE){         /* CreatePipeに失敗 */
    printf("CreatePipe failed\n");
    exit(1);
  }
    
//  sprintf(szCmdLine,"%s /message /p printer1 sample1.fms,data1.csv", szExePath);
  sprintf(szCmdLine,"%s /message sample1.fms,data1.csv", szExePath);
    
  memset(&si, 0x00,sizeof(STARTUPINFO));
  si.cb=sizeof(STARTUPINFO);
  si.dwFlags=STARTF_USESTDHANDLES;
  si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
  si.hStdOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  si.hStdError=hWrite;
  memset(&pi,0x00,sizeof(pi));
  _putenv("EURPS_REPORTPATH=.");
  _putenv("EURPS_MAPDATAPATH=.");
    
  bRtn=CreateProcessA(
        NULL,        //ファイル名
        (LPTSTR)szCmdLine,     //ファイル名+コマンド構文
        NULL,        //プロセス・セキュリティ
        NULL,        //スレッド・セキュリティ
        TRUE,        //ハンドルを継承するか?
        DETACHED_PROCESS,      //生成フラグ
        NULL,        //継承される環境ブロック
        NULL,        //起動時のフォルダ
        &si,         //スタートアップ情報へのポインタ
        &pi);        //プロセス情報へのポインタ
  if (!bRtn) {
      printf("CreateProcess failed\n");
      exit(1);
  }
    
  /* writeパイプをクローズ */
  CloseHandle(hWrite);
    
  memset(sbuf,0x00,sizeof(sbuf));
    
  /* メッセージ文の読み込み */
  if (!ReadFile(hRead,sbuf,4095,&dwRead,NULL)) {
    DWORD dwcode=GetLastError();
      /* BROKEN_PIPEはエラーではない */
    if (dwcode !=ERROR_BROKEN_PIPE) {
      /* BROKEN_PIPE以外のとき */
        printf("Read failed\n");
        exit(1);
    }
  }
    
  WaitForSingleObject(pi.hProcess,INFINITE);
  GetExitCodeProcess(pi.hProcess,&dwRC);
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(hRead);
  printf("eurps process terminated, rc = %d, returns [%s]\n", dwRC, sbuf);
  if (dwRC>0) {
      /* メッセージ文字列からメッセージIDをerridに取り出す */
      char errid_str[10];
      int errid;
    
      memset(errid_str,0x00,sizeof(errid_str));
      strncpy(errid_str,sbuf + strlen("eurps:KEEU"),3);
      errid=atol(errid_str);
      if (errid==300) {
          /* KEEU300-Wの場合のエラー処理 */
      } else if (errid==5) {
          /* KEEU005-Eの場合のエラー処理 */
      } else if (errid==6) {
          /* KEEU006-Eの場合のエラー処理 */
  
      } else if (errid== …{
             :     
          /* 以下,そのほかのエラー処理を繰り返す */
      }
      exit(1);
  }
}
 

(2) PDF形式ファイル出力のコーディング例

#include<windows.h>
#include<stdio.h>
    
void main(int argc,char *argv[])
{
  HANDLE hRead,hWrite;
  SECURITY_ATTRIBUTES saAttr;
  DWORD dwRead;
  char sbuf[4096];
  STARTUPINFO          si;
  PROCESS_INFORMATION   pi;
  BOOL                 bRtn;
  CHAR                 szCmdLine[2048];
  DWORD                dwRC;
  CHAR                 szExePath[_MAX_PATH];
    
/* eurps.exeのフルパス */
  strcpy(szExePath, "c:\\program files\\hitachi\\eur print service\\program\\eurps.exe");
    
      saAttr.nLength=sizeof(SECURITY_ATTRIBUTES);
      saAttr.bInheritHandle=TRUE;
      saAttr.lpSecurityDescriptor=NULL;
    
  bRtn=CreatePipe(&hRead,&hWrite,&saAttr,0);
  if (bRtn !=TRUE){         /* CreatePipeに失敗 */
    printf("CreatePipe failed\n");
    exit(1);
  }
    
  sprintf(szCmdLine,"%s /message /t pdf /pf output.pdf sample1.fms,data1.csv", szExePath);
    
  memset(&si, 0x00,sizeof(STARTUPINFO));
  si.cb=sizeof(STARTUPINFO);
  si.dwFlags=STARTF_USESTDHANDLES;
  si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
  si.hStdOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  si.hStdError=hWrite;
  memset(&pi,0x00,sizeof(pi));
    
  _putenv("EURPS_REPORTPATH=.");
  _putenv("EURPS_MAPDATAPATH=.");
  _putenv("EURPS_OUTPUTPATH=.");
    
  bRtn=CreateProcessA(
        NULL,        //ファイル名
        (LPTSTR)szCmdLine,     //ファイル名+コマンド構文
        NULL,        //プロセス・セキュリティ
        NULL,        //スレッド・セキュリティ
        TRUE,        //ハンドルを継承するか?
        DETACHED_PROCESS,      //生成フラグ
        NULL,        //継承される環境ブロック
        NULL,        //起動時のフォルダ
        &si,         //スタートアップ情報へのポインタ
        &pi);        //プロセス情報へのポインタ
  if (!bRtn) {
      printf("CreateProcess failed\n");
      exit(1);
  }
    
  /* writeパイプをクローズ */
  CloseHandle(hWrite);
    
  memset(sbuf,0x00,sizeof(sbuf));
    
  /* メッセージ文の読み込み */
  if (!ReadFile(hRead,sbuf,4095,&dwRead,NULL)) {
    DWORD dwcode=GetLastError();
      /* BROKEN_PIPEはエラーではない */
    if (dwcode !=ERROR_BROKEN_PIPE) {
      /* BROKEN_PIPE以外のとき */
        printf("Read failed\n");
        exit(1);
    }
  }
    
  WaitForSingleObject(pi.hProcess,INFINITE);
  GetExitCodeProcess(pi.hProcess,&dwRC);
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(hRead);
  printf("eurps process terminated, rc = %d, returns [%s]\n", dwRC, sbuf);
  if (dwRC>0) {
      /* メッセージ文字列からメッセージIDをerridに取り出す */
      char errid_str[10];
      int errid;
    
      memset(errid_str,0x00,sizeof(errid_str));
      strncpy(errid_str,sbuf + strlen("eurps:KEEU"),3);
      errid=atol(errid_str);
      if (errid==300) {
          /* KEEU300-Wの場合のエラー処理 */
      } else if (errid==5) {
          /* KEEU005-Eの場合のエラー処理 */
      } else if (errid==6) {
          /* KEEU006-Eの場合のエラー処理 */
  
      } else if (errid== …{
             :     
          /* 以下,そのほかのエラー処理を繰り返す */
      }
      exit(1);
  }
}
 

(3) EUR形式ファイル出力のコーディング例

#include<windows.h>
#include<stdio.h>
    
void main(int argc,char *argv[])
{
  HANDLE hRead,hWrite;
  SECURITY_ATTRIBUTES saAttr;
  DWORD dwRead;
  char sbuf[4096];
  STARTUPINFO          si;
  PROCESS_INFORMATION   pi;
  BOOL                 bRtn;
  CHAR                 szCmdLine[2048];
  DWORD                dwRC;
  CHAR                 szExePath[_MAX_PATH];
    
  /* eurps.exeのフルパス */
  strcpy(szExePath, "c:\\program files\\hitachi\\eur print service\\program\\eurps.exe");
    
      saAttr.nLength=sizeof(SECURITY_ATTRIBUTES);
      saAttr.bInheritHandle=TRUE;
      saAttr.lpSecurityDescriptor=NULL;
    
  bRtn=CreatePipe(&hRead,&hWrite,&saAttr,0);
  if (bRtn !=TRUE){         /* CreatePipeに失敗 */
    printf("CreatePipe failed\n");
    exit(1);
  }
    
  sprintf(szCmdLine,"%s /message /t eur /pf output.eup sample1.fms,data1.csv", szExePath);
    
  memset(&si, 0x00,sizeof(STARTUPINFO));
  si.cb=sizeof(STARTUPINFO);
  si.dwFlags=STARTF_USESTDHANDLES;
  si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
  si.hStdOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  si.hStdError=hWrite;
  memset(&pi,0x00,sizeof(pi));
    
  _putenv("EURPS_REPORTPATH=.");
  _putenv("EURPS_MAPDATAPATH=.");
  _putenv("EURPS_OUTPUTPATH=.");
    
  bRtn=CreateProcessA(
        NULL,        //ファイル名
        (LPTSTR)szCmdLine,     //ファイル名+コマンド構文
        NULL,        //プロセス・セキュリティ
        NULL,        //スレッド・セキュリティ
        TRUE,        //ハンドルを継承するか?
        DETACHED_PROCESS,      //生成フラグ
        NULL,        //継承される環境ブロック
        NULL,        //起動時のフォルダ
        &si,         //スタートアップ情報へのポインタ
        &pi);        //プロセス情報へのポインタ
  if (!bRtn) {
      printf("CreateProcess failed\n");
      exit(1);
  }
    
  /* writeパイプをクローズ */
  CloseHandle(hWrite);
    
  memset(sbuf,0x00,sizeof(sbuf));
    
  /* メッセージ文の読み込み */
  if (!ReadFile(hRead,sbuf,4095,&dwRead,NULL)) {
    DWORD dwcode=GetLastError();
      /* BROKEN_PIPEはエラーではない */
    if (dwcode !=ERROR_BROKEN_PIPE) {
      /* BROKEN_PIPE以外のとき */
        printf("Read failed\n");
        exit(1);
    }
  }
    
  WaitForSingleObject(pi.hProcess,INFINITE);
  GetExitCodeProcess(pi.hProcess,&dwRC);
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(hRead);
  printf("eurps process terminated, rc = %d, returns [%s]\n", dwRC, sbuf);
  if (dwRC>0) {
      /* メッセージ文字列からメッセージIDをerridに取り出す */
      char errid_str[10];
      int errid;
    
      memset(errid_str,0x00,sizeof(errid_str));
      strncpy(errid_str,sbuf + strlen("eurps:KEEU"),3);
      errid=atol(errid_str);
      if (errid==300) {
          /* KEEU300-Wの場合のエラー処理 */
      } else if (errid==5) {
          /* KEEU005-Eの場合のエラー処理 */
      } else if (errid==6) {
          /* KEEU006-Eの場合のエラー処理 */
  
      } else if (errid== …{
             :     
          /* 以下,そのほかのエラー処理を繰り返す */
      }
      exit(1);
  }
}
 

(4) CSV形式ファイル出力のコーディング例

#include<windows.h>
#include<stdio.h>
    
void main(int argc,char *argv[])
{
  HANDLE hRead,hWrite;
  SECURITY_ATTRIBUTES saAttr;
  DWORD dwRead;
  char sbuf[4096];
  STARTUPINFO          si;
  PROCESS_INFORMATION   pi;
  BOOL                 bRtn;
  CHAR                 szCmdLine[2048];
  DWORD                dwRC;
  CHAR                 szExePath[_MAX_PATH];
    
  /* eurps.exeのフルパス */
  strcpy(szExePath, "c:\\program files\\hitachi\\eur print service\\program\\eurps.exe");
    
      saAttr.nLength=sizeof(SECURITY_ATTRIBUTES);
      saAttr.bInheritHandle=TRUE;
      saAttr.lpSecurityDescriptor=NULL;
    
  bRtn=CreatePipe(&hRead,&hWrite,&saAttr,0);
  if (bRtn !=TRUE){         /* CreatePipeに失敗 */
    printf("CreatePipe failed\n");
    exit(1);
  }
    
  sprintf(szCmdLine,"%s /message /t csv /pf output.csv sample1.fms,data1.csv", szExePath);
    
  memset(&si, 0x00,sizeof(STARTUPINFO));
  si.cb=sizeof(STARTUPINFO);
  si.dwFlags=STARTF_USESTDHANDLES;
  si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
  si.hStdOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  si.hStdError=hWrite;
  memset(&pi,0x00,sizeof(pi));
    
  _putenv("EURPS_REPORTPATH=.");
  _putenv("EURPS_MAPDATAPATH=.");
  _putenv("EURPS_OUTPUTPATH=.");
    
  bRtn=CreateProcessA(
        NULL,        //ファイル名
        (LPTSTR)szCmdLine,     //ファイル名+コマンド構文
        NULL,        //プロセス・セキュリティ
        NULL,        //スレッド・セキュリティ
        TRUE,        //ハンドルを継承するか?
        DETACHED_PROCESS,      //生成フラグ
        NULL,        //継承される環境ブロック
        NULL,        //起動時のフォルダ
        &si,         //スタートアップ情報へのポインタ
        &pi);        //プロセス情報へのポインタ
  if (!bRtn) {
      printf("CreateProcess failed\n");
      exit(1);
  }
    
  /* writeパイプをクローズ */
  CloseHandle(hWrite);
    
  memset(sbuf,0x00,sizeof(sbuf));
    
  /* メッセージ文の読み込み */
  if (!ReadFile(hRead,sbuf,4095,&dwRead,NULL)) {
    DWORD dwcode=GetLastError();
      /* BROKEN_PIPEはエラーではない */
    if (dwcode !=ERROR_BROKEN_PIPE) {
      /* BROKEN_PIPE以外のとき */
        printf("Read failed\n");
        exit(1);
    }
  }
    
  WaitForSingleObject(pi.hProcess,INFINITE);
  GetExitCodeProcess(pi.hProcess,&dwRC);
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(hRead);
  printf("eurps process terminated, rc = %d, returns [%s]\n", dwRC, sbuf);
  if (dwRC>0) {
      /* メッセージ文字列からメッセージIDをerridに取り出す */
      char errid_str[10];
      int errid;
    
      memset(errid_str,0x00,sizeof(errid_str));
      strncpy(errid_str,sbuf + strlen("eurps:KEEU"),3);
      errid=atol(errid_str);
      if (errid==300) {
          /* KEEU300-Wの場合のエラー処理 */
      } else if (errid==5) {
          /* KEEU005-Eの場合のエラー処理 */
      } else if (errid==6) {
          /* KEEU006-Eの場合のエラー処理 */
  
      } else if (errid== …{
             :     
          /* 以下,そのほかのエラー処理を繰り返す */
      }
      exit(1);
  }
}
 

(5) Excel形式ファイル出力のコーディング例

#include<windows.h>
#include<stdio.h>
    
void main(int argc,char *argv[])
{
  HANDLE hRead,hWrite;
  SECURITY_ATTRIBUTES saAttr;
  DWORD dwRead;
  char sbuf[4096];
  STARTUPINFO          si;
  PROCESS_INFORMATION   pi;
  BOOL                 bRtn;
  CHAR                 szCmdLine[2048];
  DWORD                dwRC;
  CHAR                 szExePath[_MAX_PATH];
    
/* eurps.exeのフルパス */
  strcpy(szExePath, "c:\\program files\\hitachi\\eur print service\\program\\eurps.exe");
    
      saAttr.nLength=sizeof(SECURITY_ATTRIBUTES);
      saAttr.bInheritHandle=TRUE;
      saAttr.lpSecurityDescriptor=NULL;
    
  bRtn=CreatePipe(&hRead,&hWrite,&saAttr,0);
  if (bRtn !=TRUE){         /* CreatePipeに失敗 */
    printf("CreatePipe failed\n");
    exit(1);
  }
    
  sprintf(szCmdLine,"%s /message /t xlsx /pf output.xlsx sample1.fms,data1.csv", szExePath);
    
  memset(&si, 0x00,sizeof(STARTUPINFO));
  si.cb=sizeof(STARTUPINFO);
  si.dwFlags=STARTF_USESTDHANDLES;
  si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
  si.hStdOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  si.hStdError=hWrite;
  memset(&pi,0x00,sizeof(pi));
    
  _putenv("EURPS_REPORTPATH=.");
  _putenv("EURPS_MAPDATAPATH=.");
  _putenv("EURPS_OUTPUTPATH=.");
    
  bRtn=CreateProcessA(
        NULL,        //ファイル名
        (LPTSTR)szCmdLine,     //ファイル名+コマンド構文
        NULL,        //プロセス・セキュリティ
        NULL,        //スレッド・セキュリティ
        TRUE,        //ハンドルを継承するか?
        DETACHED_PROCESS,      //生成フラグ
        NULL,        //継承される環境ブロック
        NULL,        //起動時のフォルダ
        &si,         //スタートアップ情報へのポインタ
        &pi);        //プロセス情報へのポインタ
  if (!bRtn) {
      printf("CreateProcess failed\n");
      exit(1);
  }
    
  /* writeパイプをクローズ */
  CloseHandle(hWrite);
    
  memset(sbuf,0x00,sizeof(sbuf));
    
  /* メッセージ文の読み込み */
  if (!ReadFile(hRead,sbuf,4095,&dwRead,NULL)) {
    DWORD dwcode=GetLastError();
      /* BROKEN_PIPEはエラーではない */
    if (dwcode !=ERROR_BROKEN_PIPE) {
      /* BROKEN_PIPE以外のとき */
        printf("Read failed\n");
        exit(1);
    }
  }
    
  WaitForSingleObject(pi.hProcess,INFINITE);
  GetExitCodeProcess(pi.hProcess,&dwRC);
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(hRead);
  printf("eurps process terminated, rc = %d, returns [%s]\n", dwRC, sbuf);
  if (dwRC>0) {
      /* メッセージ文字列からメッセージIDをerridに取り出す */
      char errid_str[10];
      int errid;
    
      memset(errid_str,0x00,sizeof(errid_str));
      strncpy(errid_str,sbuf + strlen("eurps:KEEU"),3);
      errid=atol(errid_str);
      if (errid==300) {
          /* KEEU300-Wの場合のエラー処理 */
      } else if (errid==5) {
          /* KEEU005-Eの場合のエラー処理 */
      } else if (errid==6) {
          /* KEEU006-Eの場合のエラー処理 */
  
      } else if (errid== …{
             :     
          /* 以下,そのほかのエラー処理を繰り返す */
      }
      exit(1);
  }
}