home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1996 February
/
VPR9602A.ISO
/
fwindows
/
archive
/
comwp260.lzh
/
SAMPLES.LZH
/
SAMPLE3.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-10-10
|
7KB
|
245 lines
/*----------------------------------------------------------------------*
* このDLLを利用するためには、次の操作が必要です。
* 1. sample3.dllをwindowsディレクトリ、windows\systemディレクトリ
* PATHのあるディレクトリのいずれかに移動する。
* 2. comwin.iniの[CommandDll]セクションに次の記述をくわえる。
* sample3.dll=SampleCommand
* 3. comwinのプロンプトに次のように入力する。
* c:\>command0
* c:\>command1
*----------------------------------------------------------------------*
*/
#include <windows.h>
#include "comwin.h"
typedef struct CMDTABLE CMDTABLE;
struct CMDTABLE {
char *pszCmd;
int (*pfnCmd)(void);
};
PUTS NEAR cwPuts;
GETS NEAR cwGets;
FPUTS NEAR cwFputs;
FGETS NEAR cwFgets;
SYSTEM NEAR cwSystem;
CALLCOMMAND NEAR cwCallConsole;
GETCH NEAR cwGetch;
INKEY NEAR cwInkey;
FWRITE NEAR cwFwrite;
FREAD NEAR cwFread;
#if !defined(WIN32)
int FAR PASCAL LibMain(HINSTANCE hInstance, WORD wDataSeg, WORD wHeapSize,
LPSTR lpszCmdLine)
{
if (wHeapSize > 0) {
UnlockData(0);
}
return 1;
}
#endif
/********************
CallCommand Sample
********************
*/
BOOL ListCommand(CMDTABLE *cmdTable, LPSTR lpszCmdName);
int command0Cmd(void);
int command1Cmd(void);
BOOL FAR PASCAL SampleCommand(FARPROC FAR *lpfnIO,
LPSTR lpszCmdLine,
LPLONG lpReturn)
{
static CMDTABLE cmdTable[] = {
{"command0", command0Cmd},
{"command1", command1Cmd},
{NULL, NULL}
};
CMDTABLE *pCT;
/* 特別処理、メッセージのチェック */
switch (lpReturn[0]) {
case CW_M_HELP: /* 実は 0 */
/* コマンドの一覧を返す */
return ListCommand(cmdTable, lpszCmdLine);
case CW_M_CONSOLE_INFO:
/* コンソール情報が来るが、
マルチスレッド(=WIN32)、マルチタスク(=WIN16)対応が
大変なので処理していない */
return FALSE;
}
/* 通常処理のチェック */
if (lpReturn[0] != CW_M_EXEC) { /* 実は -1 */
return FALSE;
}
/* 入出力部を実体化する lpfnIO[0] - lpfnIO[5] は必ず定義されている */
cwPuts = (PUTS)lpfnIO[0];
cwGets = (GETS)lpfnIO[1];
cwFputs = (FPUTS)lpfnIO[2];
cwFgets = (FGETS)lpfnIO[3];
cwSystem = (SYSTEM)lpfnIO[4];
#if 0 /* コンソール側と通信の必要があるときに定義 */
cwCallConsle = (CALLCOMMAND)lpfnIO[5];
#endif
#if 0 /* コンソール側が直接入力をサポートしているとき定義 */
cwGetch = (GETCH)lpfnIO[6];
cwInkey = (INKEY)lpfnIO[7];
#endif
#if 0 /* コンソール側が2進入出力をサポートしているとき定義 */
cwFwrite = (GETCH)lpfnIO[8];
cwFread = (INKEY)lpfnIO[9];
#endif
/* 通常処理、一致したコマンドがあれば処理する */
for (pCT = cmdTable; pCT->pszCmd != NULL; pCT++) {
if (lstrcmp(pCT->pszCmd, lpszCmdLine) == 0) {
break;
}
}
if (pCT->pszCmd == NULL) {
return FALSE;
}
lpReturn[0] = pCT->pfnCmd();
return TRUE;
}
BOOL ListCommand(CMDTABLE *cmdTable, LPSTR lpszCmdName)
{
static int i = 0; /* マルチスレッド、マルチタスクに注意 */
if (cmdTable[i].pszCmd == NULL) {
i = 0;
return FALSE;
}
lstrcpy(lpszCmdName, cmdTable[i].pszCmd); i++;
return TRUE;
}
int command0Cmd(void)
{
static char szMsg[] = "command0 は0を返すコマンドです";
cwPuts(szMsg);
return 0;
}
int command1Cmd(void)
{
static char szMsg[] = "command1 は1を返すコマンドです";
cwPuts(szMsg);
return 1;
}
/****************************************************
CallInterpreter Sample (UNIX ライクな語句解釈)
この機能を用いるためには comwin.ini の [InterpreterDll] セクションに
sample3.dll=SampleInterpreter を先頭に書き込む。
**********************************************************
*/
BOOL FAR PASCAL SampleInterpreter(FARPROC FAR *lpfnIO,
LPSTR lpszCmdLine,
LPLONG lpReturn)
{
static HGLOBAL hGlobal = NULL;
LPSTR lpGlobal;
int nLen;
/* 特別処理、確保した領域があれば解放する。*/
if (lpReturn[0] == 0) {
if (lpszCmdLine[0] == '\0') {
if (hGlobal != NULL) {
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
return TRUE;
}
}
return FALSE;
}
/* 通常処理のチェック */
if (lpReturn[0] != -1) {
return FALSE;
}
/* 入出力部を実体化する */
cwPuts = (PUTS)lpfnIO[0];
cwGets = (GETS)lpfnIO[1];
cwFputs = (FPUTS)lpfnIO[2];
cwFgets = (FGETS)lpfnIO[3];
cwSystem = (SYSTEM)lpfnIO[4];
/* 通常処理、lpReturn[0] に分解したコマンド群を返す。*/
/* 形式は "str1\0str2\0str3\0str4\0\0" に準ずる */
nLen = lstrlen(lpszCmdLine);
hGlobal = GlobalAlloc(GHND, nLen + 5); /* lpszCmdLine + "\0fg\0\0" */
if (hGlobal == NULL) {
return FALSE;
}
lpGlobal = GlobalLock(hGlobal);
lstrcpy(lpGlobal, lpszCmdLine);
if (nLen > 0 && lpGlobal[nLen - 1] == '&') {
lpGlobal[nLen - 1] = '\0';
} else {
lstrcpy(&lpGlobal[nLen+1], "fg");
}
lpReturn[0] = (LONG)lpGlobal;
return TRUE;
}
/*-----------------------------------------------------------------
CallScript Sample (拡張子 DOC のファイルをメモ帳に関連づける)
この機能を用いるためには comwin.ini の [ScriptDll] セクションに
sample3.dll=SampleScript を先頭に書き込む。
*------------------------------------------------------------------
*/
BOOL FAR PASCAL SampleScript(FARPROC FAR *lpfnIO,
LPSTR lpszCmdLine,
LPLONG lpReturn)
{
static char szExt[]= "doc\0c\0h\0asm\0\0"; /* NULL文字を2つ続ける */
/* 形式は "str1\0str2\0str3\0str4\0\0" */
static char szCommand[256];
/* 特別処理、lpReturn[0] に拡張子へのポインタを返す。*/
if (lpReturn[0] == 0) {
if (lpszCmdLine[0] == '\0') {
lpReturn[0] = (LONG)(LPSTR)szExt;
return TRUE;
}
return FALSE;
}
/* 通常処理のチェック */
if (lpReturn[0] != -1) {
return FALSE;
}
/* 入出力部を実体化する */
cwPuts = (PUTS)lpfnIO[0];
cwGets = (GETS)lpfnIO[1];
cwFputs = (FPUTS)lpfnIO[2];
cwFgets = (FGETS)lpfnIO[3];
cwSystem = (SYSTEM)lpfnIO[4];
/* 通常処理 */
lstrcpy(szCommand, "notepad");
lstrcat(szCommand, " ");
lstrcat(szCommand, lpszCmdLine);
cwSystem(szCommand);
return TRUE;
}