home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1996 February / VPR9602A.ISO / fwindows / comwp260 / samples / sample3.c < prev    next >
C/C++ Source or Header  |  1995-10-09  |  7KB  |  245 lines

  1. /*----------------------------------------------------------------------*
  2.  * このDLLを利用するためには、次の操作が必要です。
  3.  * 1. sample3.dllをwindowsディレクトリ、windows\systemディレクトリ
  4.  *    PATHのあるディレクトリのいずれかに移動する。
  5.  * 2. comwin.iniの[CommandDll]セクションに次の記述をくわえる。
  6.  *    sample3.dll=SampleCommand
  7.  * 3. comwinのプロンプトに次のように入力する。
  8.  *    c:\>command0
  9.  *    c:\>command1
  10.  *----------------------------------------------------------------------*
  11.  */
  12.  
  13. #include <windows.h>
  14. #include "comwin.h"
  15.  
  16. typedef struct CMDTABLE CMDTABLE;
  17. struct CMDTABLE {
  18.     char *pszCmd;
  19.     int (*pfnCmd)(void);
  20. };
  21.  
  22. PUTS        NEAR cwPuts;
  23. GETS        NEAR cwGets;
  24. FPUTS       NEAR cwFputs;
  25. FGETS       NEAR cwFgets;
  26. SYSTEM      NEAR cwSystem;
  27. CALLCOMMAND NEAR cwCallConsole;
  28. GETCH       NEAR cwGetch;
  29. INKEY       NEAR cwInkey;
  30. FWRITE      NEAR cwFwrite;
  31. FREAD       NEAR cwFread;
  32.  
  33. #if !defined(WIN32)
  34. int FAR PASCAL LibMain(HINSTANCE hInstance, WORD wDataSeg, WORD wHeapSize,
  35.                        LPSTR lpszCmdLine)
  36. {
  37.     if (wHeapSize > 0) {
  38.         UnlockData(0);
  39.     }
  40.     return 1;
  41. }
  42. #endif
  43.  
  44. /********************
  45.   CallCommand Sample
  46.  ********************
  47.  */
  48. BOOL ListCommand(CMDTABLE *cmdTable, LPSTR lpszCmdName);
  49. int command0Cmd(void);
  50. int command1Cmd(void);
  51.  
  52. BOOL FAR PASCAL SampleCommand(FARPROC FAR *lpfnIO,
  53.                               LPSTR lpszCmdLine,
  54.                               LPLONG lpReturn)
  55. {
  56.     static CMDTABLE cmdTable[] = {
  57.         {"command0", command0Cmd},
  58.         {"command1", command1Cmd},
  59.         {NULL, NULL}
  60.     };
  61.     CMDTABLE *pCT;
  62.  
  63.     /* 特別処理、メッセージのチェック */
  64.     switch (lpReturn[0]) {
  65.         case CW_M_HELP: /* 実は 0 */
  66.             /* コマンドの一覧を返す */
  67.             return ListCommand(cmdTable, lpszCmdLine);
  68.         case CW_M_CONSOLE_INFO:
  69.             /* コンソール情報が来るが、
  70.                マルチスレッド(=WIN32)、マルチタスク(=WIN16)対応が
  71.                大変なので処理していない */
  72.             return FALSE;
  73.     }
  74.  
  75.     /* 通常処理のチェック */
  76.     if (lpReturn[0] != CW_M_EXEC) { /* 実は -1 */
  77.         return FALSE;
  78.     }
  79.  
  80.     /* 入出力部を実体化する lpfnIO[0] - lpfnIO[5] は必ず定義されている */
  81.     cwPuts       = (PUTS)lpfnIO[0];
  82.     cwGets       = (GETS)lpfnIO[1];
  83.     cwFputs      = (FPUTS)lpfnIO[2];
  84.     cwFgets      = (FGETS)lpfnIO[3];
  85.     cwSystem     = (SYSTEM)lpfnIO[4];
  86.  
  87. #if 0 /* コンソール側と通信の必要があるときに定義 */
  88.     cwCallConsle = (CALLCOMMAND)lpfnIO[5];
  89. #endif
  90. #if 0 /* コンソール側が直接入力をサポートしているとき定義 */
  91.     cwGetch      = (GETCH)lpfnIO[6];
  92.     cwInkey      = (INKEY)lpfnIO[7];
  93. #endif
  94. #if 0 /* コンソール側が2進入出力をサポートしているとき定義 */
  95.     cwFwrite     = (GETCH)lpfnIO[8];
  96.     cwFread      = (INKEY)lpfnIO[9];
  97. #endif
  98.  
  99.     /* 通常処理、一致したコマンドがあれば処理する */
  100.     for (pCT = cmdTable; pCT->pszCmd != NULL; pCT++) {
  101.         if (lstrcmp(pCT->pszCmd, lpszCmdLine) == 0) {
  102.             break;
  103.         }
  104.     }
  105.     if (pCT->pszCmd == NULL) {
  106.         return FALSE;
  107.     }
  108.  
  109.     lpReturn[0] = pCT->pfnCmd();
  110.     return TRUE;
  111. }
  112.  
  113. BOOL ListCommand(CMDTABLE *cmdTable, LPSTR lpszCmdName)
  114. {
  115.     static int i = 0; /* マルチスレッド、マルチタスクに注意 */
  116.  
  117.     if (cmdTable[i].pszCmd == NULL) {
  118.         i = 0;
  119.         return FALSE;
  120.     }
  121.     lstrcpy(lpszCmdName, cmdTable[i].pszCmd); i++;
  122.     return TRUE;
  123. }
  124.  
  125. int command0Cmd(void)
  126. {
  127.     static char szMsg[] = "command0 は0を返すコマンドです";
  128.  
  129.     cwPuts(szMsg);
  130.     return 0;
  131. }
  132.  
  133. int command1Cmd(void)
  134. {
  135.     static char szMsg[] = "command1 は1を返すコマンドです";
  136.  
  137.     cwPuts(szMsg);
  138.     return 1;
  139. }
  140.  
  141. /****************************************************
  142.     CallInterpreter Sample (UNIX ライクな語句解釈)
  143.  
  144.     この機能を用いるためには comwin.ini の [InterpreterDll] セクションに
  145.     sample3.dll=SampleInterpreter を先頭に書き込む。
  146.  
  147.  **********************************************************
  148.  */
  149. BOOL FAR PASCAL SampleInterpreter(FARPROC FAR *lpfnIO,
  150.                                   LPSTR lpszCmdLine,
  151.                                   LPLONG lpReturn)
  152. {
  153.     static HGLOBAL hGlobal = NULL;
  154.     LPSTR lpGlobal;
  155.     int nLen;
  156.  
  157.     /* 特別処理、確保した領域があれば解放する。*/
  158.     if (lpReturn[0] == 0) {
  159.         if (lpszCmdLine[0] == '\0') {
  160.             if (hGlobal != NULL) {
  161.                 GlobalUnlock(hGlobal);
  162.                 GlobalFree(hGlobal);
  163.                 return TRUE;
  164.             }
  165.         }
  166.         return FALSE;
  167.     }
  168.  
  169.     /* 通常処理のチェック */
  170.     if (lpReturn[0] != -1) {
  171.         return FALSE;
  172.     }
  173.  
  174.     /* 入出力部を実体化する */
  175.     cwPuts = (PUTS)lpfnIO[0];
  176.     cwGets = (GETS)lpfnIO[1];
  177.     cwFputs = (FPUTS)lpfnIO[2];
  178.     cwFgets = (FGETS)lpfnIO[3];
  179.     cwSystem = (SYSTEM)lpfnIO[4];
  180.  
  181.     /* 通常処理、lpReturn[0] に分解したコマンド群を返す。*/
  182.     /* 形式は "str1\0str2\0str3\0str4\0\0" に準ずる */
  183.     nLen = lstrlen(lpszCmdLine);
  184.     hGlobal = GlobalAlloc(GHND, nLen + 5); /* lpszCmdLine + "\0fg\0\0" */
  185.     if (hGlobal == NULL) {
  186.         return FALSE;
  187.     }
  188.     lpGlobal = GlobalLock(hGlobal);
  189.  
  190.     lstrcpy(lpGlobal, lpszCmdLine);
  191.     if (nLen > 0 && lpGlobal[nLen - 1] == '&') {
  192.         lpGlobal[nLen - 1] = '\0';
  193.     } else {
  194.         lstrcpy(&lpGlobal[nLen+1], "fg");
  195.     }
  196.     lpReturn[0] = (LONG)lpGlobal;
  197.     return TRUE;
  198. }
  199.  
  200. /*-----------------------------------------------------------------
  201.     CallScript Sample (拡張子 DOC のファイルをメモ帳に関連づける)
  202.  
  203.     この機能を用いるためには comwin.ini の [ScriptDll] セクションに
  204.     sample3.dll=SampleScript を先頭に書き込む。
  205.  
  206.  *------------------------------------------------------------------
  207.  */
  208. BOOL FAR PASCAL SampleScript(FARPROC FAR *lpfnIO,
  209.                              LPSTR lpszCmdLine,
  210.                              LPLONG lpReturn)
  211. {
  212.     static char szExt[]= "doc\0c\0h\0asm\0\0"; /* NULL文字を2つ続ける */
  213.                        /* 形式は "str1\0str2\0str3\0str4\0\0" */
  214.     static char szCommand[256];
  215.  
  216.     /* 特別処理、lpReturn[0] に拡張子へのポインタを返す。*/
  217.     if (lpReturn[0] == 0) {
  218.         if (lpszCmdLine[0] == '\0') {
  219.             lpReturn[0] = (LONG)(LPSTR)szExt;
  220.             return TRUE;
  221.         }
  222.         return FALSE;
  223.     }
  224.  
  225.     /* 通常処理のチェック */
  226.     if (lpReturn[0] != -1) {
  227.         return FALSE;
  228.     }
  229.  
  230.     /* 入出力部を実体化する */
  231.     cwPuts = (PUTS)lpfnIO[0];
  232.     cwGets = (GETS)lpfnIO[1];
  233.     cwFputs = (FPUTS)lpfnIO[2];
  234.     cwFgets = (FGETS)lpfnIO[3];
  235.     cwSystem = (SYSTEM)lpfnIO[4];
  236.  
  237.     /* 通常処理 */
  238.     lstrcpy(szCommand, "notepad");
  239.     lstrcat(szCommand, " ");
  240.     lstrcat(szCommand, lpszCmdLine);
  241.  
  242.     cwSystem(szCommand);
  243.     return TRUE;
  244. }
  245.