home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 December
/
VPR9712A.ISO
/
OLS
/
WIN32
/
COMWP380
/
comwp380.exe
/
SAMPLES.EXE
/
SAMPLE3.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-08-25
|
18KB
|
606 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 <windowsx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "comwin.h"
typedef struct CMDTABLE CMDTABLE;
struct CMDTABLE {
char *pszCmd;
int (*pfnCmd)(int, char **);
};
PUTS NEAR cwsPuts;
GETS NEAR cwsGets;
FPUTS NEAR cwsFputs;
FGETS NEAR cwsFgets;
SYSTEM NEAR cwsSystem;
CALLCOMMAND NEAR cwsCallConsole;
GETCH NEAR cwsGetch;
INKEY NEAR cwsInkey;
FWRITE NEAR cwsFwrite;
FREAD NEAR cwsFread;
#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(int, char **);
int command1Cmd(int, char **);
int command2Cmd(int, char **);
int clipCmd(int, char **);
int pasteCmd(int, char **);
int printfCmd(int, char **);
int verCmd(int, char **);
BOOL FAR PASCAL SampleCommand(FARPROC FAR *lpfnIO,
LPSTR lpszCmdLine,
LPLONG lpReturn)
{
static CMDTABLE cmdTable[] = {
{"command0", command0Cmd},
{"command1", command1Cmd},
{"command2", command2Cmd},
{"clip", clipCmd},
{"paste", pasteCmd},
{"printf", printfCmd},
{"ver", verCmd},
{NULL, NULL}
};
CMDTABLE *pCT;
int nArgv[0x80];
char szReturn[0x100];
int argc;
char *argv[0x80];
int i;
/* 通常処理のチェック */
if (lpReturn[0] != CW_M_EXEC) { /* 実は -1 */
/* 特別処理、メッセージのチェック */
switch (lpReturn[0]) {
case CW_M_HELP: /* 実は 0 */
/* コマンドの一覧を返す */
return ListCommand(cmdTable, lpszCmdLine);
case CW_M_CONSOLE_INFO:
/* コンソール情報が来るが、
マルチスレッド(=WIN32)、マルチタスク(=WIN16)対応が
大変なので処理していない */
return FALSE;
default:
return FALSE;
}
}
/* 入出力部を実体化する lpfnIO[0] - lpfnIO[5] は必ず定義されている */
cwsPuts = (PUTS)lpfnIO[0];
cwsGets = (GETS)lpfnIO[1];
cwsFputs = (FPUTS)lpfnIO[2];
cwsFgets = (FGETS)lpfnIO[3];
cwsSystem = (SYSTEM)lpfnIO[4];
#if 1 /* コンソール側と通信の必要があるときに定義 */
cwsCallConsole = (CALLCOMMAND)lpfnIO[5];
#endif
#if 0 /* コンソール側が直接入力をサポートしているとき定義 */
cwsGetch = (GETCH)lpfnIO[6];
cwsInkey = (INKEY)lpfnIO[7];
#endif
#if 0 /* コンソール側が2進入出力をサポートしているとき定義 */
cwsFwrite = (GETCH)lpfnIO[8];
cwsFread = (INKEY)lpfnIO[9];
#endif
/* 通常処理、一致したコマンドがあれば処理する */
for (pCT = cmdTable; pCT->pszCmd != NULL; pCT++) {
if (strncmp(pCT->pszCmd, lpszCmdLine, lstrlen(pCT->pszCmd)) == 0) break;
}
if (pCT->pszCmd == NULL) return FALSE;
/* 引数の作成 */
argc = MakeArgument(NULL, pCT->pszCmd, lpszCmdLine,
nArgv, szReturn, sizeof(szReturn));
if (lstrcmp(pCT->pszCmd, szReturn) != 0) return FALSE;
for (i = 0; i < argc; i++) {
argv[i] = szReturn + nArgv[i];
}
argv[i] = NULL;
/* コマンド呼び出し */
*lpReturn = (LONG)pCT->pfnCmd(argc, argv);
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(int argc, char **argv)
{
cwsPuts("command0 は0を返すコマンドです");
return 0;
}
int command1Cmd(int argc, char **argv)
{
static char szMsg[] = "command1 は1を返すコマンドです";
cwsPuts(szMsg);
return 1;
}
int command2Cmd(int argc, char **argv)
{
#if !defined(WIN32)
cwsFputs("Win16 上では Unicode をサポートしていません。\n", NULL);
return 1;
#else
FPUTSW cwsFputsW;
FGETSW cwsFgetsW;
FARPROC afnIO[6];
CW_S_UNICODE_ENTRY ue;
/* 構造体の初期化 */
memset(&ue, 0, sizeof(ue));
ue.lMessage = CW_M_UNICODE_ENTRY;
ue.lSize = sizeof(ue);
ue.lMode = CW_MODE_GET;
ue.lFuncMax = 6; /* 6 以上の数値 */
if (cwsCallConsole(afnIO, "", (LPLONG)&ue) == FALSE) {
cwsPuts("この端末は Unicode をサポートしていません。");
return 1;
}
cwsFputsW = (FPUTSW)afnIO[2];
if (cwsFputsW == NULL) {
cwsPuts("この端末は cwFputsW 機能をもっていません。");
return 1;
}
cwsFgetsW = (FGETSW)afnIO[3];
if (cwsFgetsW == NULL) {
cwsPuts("この端末は cwFgetsW 機能をもっていません。");
}
cwsFputsW(L"このテキストは Unicode です。\n", NULL);
return 0;
#endif
}
int printfCmd(int argc, char **argv)
{
LPSTR lpOut;
LPSTR lpS, lpE;
char szBuf[0x80];
char cStack;
int nArg, nOut;
LPSTR lpArg;
/* 引数チェック */
if (argc <= 1) {
cwsFputs("printf format [env1 ...]\n", NULL);
return 1;
}
/* 出力用のバッファを確保 (4096文字分) */
/* メモリオーバーチェックはいい加減です。(^^;) */
lpOut = GlobalAllocPtr(GMEM_MOVEABLE, 0x1000);
if (lpOut == NULL) {
cwsFputs("memory error\n", NULL);
return 1;
}
/* 各引数の環境変数値を保存 */
nArg = 2; nOut = 0;
for (lpS = argv[1]; *lpS != '\0' && nOut < 0x800; lpS++) {
if (IsDBCSLeadByte(*lpS) == TRUE && *(lpS + 1) != '\0') {
/* 2バイトコード */
*(lpOut + nOut) = *lpS; nOut++;
if (*(lpS + 1) != '\0') {
lpS++;
*(lpOut + nOut) = *lpS; nOut++;
}
} else if (*lpS == '%') {
/* 出力フォーマット */
for (lpE = lpS + 1; *lpE != '\0'; lpE++) {
if (*lpE == 'd' ||
*lpE == 'i' ||
*lpE == 'o' ||
*lpE == 'x' ||
*lpE == 'X' ||
*lpE == 'u' ||
*lpE == 'c') {
/* 整数系 */
LONG lArg;
lpArg = (nArg < argc) ? cwGetenv(argv[nArg]) : "";
if (lpArg == NULL) lpArg = "";
nArg++;
lstrcpyn(szBuf, lpArg, 0x80);
if (*lpArg == '0' && *(lpArg + 1) == 'x') {
lArg = strtol(szBuf, NULL, 0x10);
} else {
lArg = strtol(szBuf, NULL, 10);
}
cStack = *(lpE + 1); *(lpE + 1) = '\0';
wsprintf(lpOut + nOut, lpS, lArg);
*(lpE + 1) = cStack;
nOut += lstrlen(lpOut + nOut);
break;
} else if (*lpE == 's') {
/* 文字列 */
lpArg = (nArg < argc) ? cwGetenv(argv[nArg]) : "";
if (lpArg == NULL) lpArg = "";
nArg++;
if (lstrlen(lpArg) + nOut >= 0x800) break;
cStack = *(lpE + 1); *(lpE + 1) = '\0';
wsprintf(lpOut + nOut, lpS, lpArg);
*(lpE + 1) = cStack;
nOut += lstrlen(lpOut + nOut);
break;
} else if (*lpE == 'f' ||
*lpE == 'e' ||
*lpE == 'E' ||
*lpE == 'g' ||
*lpE == 'G') {
/* 浮動小数点系 */
double eArg;
lpArg = (nArg < argc) ? cwGetenv(argv[nArg]) : "";
if (lpArg == NULL) lpArg = "";
nArg++;
lstrcpyn(szBuf, lpArg, 0x80);
eArg = strtod(szBuf, NULL);
cStack = *(lpE + 1); *(lpE + 1) = '\0';
sprintf(lpOut + nOut, lpS, eArg); /* sprintf */
*(lpE + 1) = cStack;
nOut += lstrlen(lpOut + nOut);
break;
} else if (*lpE == '%') {
/* '%' 文字 */
cStack = *(lpE + 1); *(lpE + 1) = '\0';
wsprintf(lpOut + nOut, lpS);
*(lpE + 1) = cStack;
nOut += lstrlen(lpOut + nOut);
break;
}
}
lpS = lpE;
} else if (*lpS == '\\' && *(lpS + 1) != '\0') {
/* エスケープ文字 */
lpS++;
switch (*lpS) {
case 'a':
*(lpOut + nOut) = '\a'; nOut++;
break;
case 'b':
*(lpOut + nOut) = '\b'; nOut++;
break;
case 'f':
*(lpOut + nOut) = '\f'; nOut++;
break;
case 'n':
*(lpOut + nOut) = '\n'; nOut++;
break;
case 'r':
*(lpOut + nOut) = '\r'; nOut++;
break;
case 't':
*(lpOut + nOut) = '\t'; nOut++;
break;
case 'v':
*(lpOut + nOut) = '\v'; nOut++;
break;
case 'x':
if (*(lpS + 1) != '\0') {
if (*(lpS + 2) != '\0') {
unsigned char c1, c2;
c1 = *(lpS + 1);
c2 = *(lpS + 2);
if ('0' <= c1 && c1 <= '9') {
c1 -= '0';
} else if ('A' <= c1 && c1 <= 'F') {
c1 -= 'A' - 10;
} else if ('a' <= c1 && c1 <= 'f') {
c1 -= 'a' - 10;
} else {
c1 = 0;
}
if ('0' <= c2 && c2 <= '9') {
c2 -= '0';
} else if ('A' <= c2 && c2 <= 'F') {
c2 -= 'A' - 10;
} else if ('a' <= c2 && c2 <= 'f') {
c2 -= 'a' - 10;
} else {
c2 = 0;
}
*(lpOut + nOut) = c1 * 0x10 + c2; nOut++;
lpS += 2;
break;
}
}
*(lpOut + nOut) = 'x'; nOut++;
break;
case '\\':
*(lpOut + nOut) = '\\'; nOut++;
break;
case '?':
*(lpOut + nOut) = '\?'; nOut++;
break;
case '\'':
*(lpOut + nOut) = '\''; nOut++;
break;
case '\"':
*(lpOut + nOut) = '\"'; nOut++;
break;
default:
*(lpOut + nOut) = *lpS; nOut++;
break;
}
} else {
/* 一般文字 */
*(lpOut + nOut) = *lpS; nOut++;
}
}
*(lpOut + nOut) = '\0';
cwsFputs(lpOut, NULL);
GlobalFreePtr(lpOut);
return 0;
}
#if defined(WIN32)
#define _huge
#endif
int clipCmd(int argc, char **argv)
{
char szBuf[256];
HGLOBAL hClip;
HGLOBAL hClipNew;
char _huge *lpClipNew;
DWORD dwSize;
DWORD dwSizeNew;
dwSize = 0;
hClip = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 1);
while (cwsFgets(szBuf, 256, NULL) != NULL) {
dwSizeNew = dwSize + lstrlen(szBuf);
hClipNew = GlobalReAlloc(hClip, dwSizeNew + 1,
GMEM_MOVEABLE | GMEM_ZEROINIT);
lpClipNew = GlobalLock(hClipNew);
if (lpClipNew == NULL) {
break;
}
hmemcpy(lpClipNew + dwSize, szBuf, dwSizeNew - dwSize);
GlobalUnlock(hClipNew);
dwSize = dwSizeNew;
hClip = hClipNew;
}
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_TEXT, hClip);
CloseClipboard();
return 0;
}
int pasteCmd(int argc, char **argv)
{
HGLOBAL hClip;
HGLOBAL hMem;
char _huge *lpClip;
char _huge *lpMem;
DWORD dwSize;
OpenClipboard(NULL);
hClip = GetClipboardData(CF_TEXT);
lpClip = GlobalLock(hClip);
if (lpClip == NULL) {
CloseClipboard();
cwsFputs("can't find CF_TEXT\n", (LPSTR)-1);
return -1;
}
dwSize = lstrlen(lpClip);
hMem = GlobalAlloc(GHND, dwSize + 1);
lpMem = GlobalLock(hMem);
if (lpMem == NULL) {
CloseClipboard();
cwsFputs("can't alloc Memory\n", (LPSTR)-1);
return -1;
}
hmemcpy(lpMem, lpClip, dwSize);
GlobalUnlock(hClip);
CloseClipboard();
cwsFputs(lpMem, NULL);
GlobalUnlock(hMem);
GlobalFree(hMem);
return 0;
}
int verCmd(int argc, char **argv)
{
cwsPuts("Sample3 for ComWin Ver. 3.80 "
"Copyright (c) 1994-97 by M.Maedera(JPN)");
return 0;
}
/****************************************************
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;
}
/* 入出力部を実体化する */
cwsPuts = (PUTS)lpfnIO[0];
cwsGets = (GETS)lpfnIO[1];
cwsFputs = (FPUTS)lpfnIO[2];
cwsFgets = (FGETS)lpfnIO[3];
cwsSystem = (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;
}
/* 入出力部を実体化する */
cwsPuts = (PUTS)lpfnIO[0];
cwsGets = (GETS)lpfnIO[1];
cwsFputs = (FPUTS)lpfnIO[2];
cwsFgets = (FGETS)lpfnIO[3];
cwsSystem = (SYSTEM)lpfnIO[4];
/* 通常処理 */
lstrcpy(szCommand, "notepad");
lstrcat(szCommand, " ");
lstrcat(szCommand, lpszCmdLine);
cwsSystem(szCommand);
return TRUE;
}