⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 popd.c

📁 使用于OS/2下的小工具的C源程序,使用于OS/2下的小工具的C源程序
💻 C
字号:
/*
* POPD.C - Testclient for message queues.
*
*
* PROGRAMMER:	    Martti Ylikoski
* CREATED:	    17.3.1991
*/
static char *VERSION = "Version  1.0" ;
/*
*/

static char *progname ;
void out_kbd( char *str ) ;

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define INCL_KBD
#define INCL_DOS
#include <os2.h>
#include "queue.h"

typedef struct kbdpacket
{
   unsigned monflags ;
   KBDKEYINFO kbdkeyinfo ;
   unsigned ddflags ;
} KBDBUF ;

KBDBUF kbdbuf ;
//int send_queue(char *queue_name, char *message, USHORT cbElement, USHORT usRequest) ;

int main(int argc, char *argv[])
{
HQUEUE hpopresp ; /* queuehandle */
USHORT ret ;
int i ;
QUEUERESULT qres ;
PVOID pmesg ;
USHORT cbElement ;
BYTE bElemprty ;
char buf[512], bufdrive[3], *ptmp ;
SEL ginfo, linfo ;
LINFOSEG FAR *plis ;
char sga[4], queue_name[80] ;

   progname = argv[0] ;

   if (argc == 2 && (strcmpi(argv[1], "-q") == 0
       || strcmpi(argv[1], "/q") == 0))
   {
      QueSend("\\queues\\popreq", "  ", 3, 1,"START /C dirserv.exe", progname) ; /* send EXIT command */
      printf("Directory stack server removed. \n") ;
      return( 0 ) ;
   }

   if (( ret = DosGetInfoSeg(&ginfo, &linfo)) != 0)
   {
      printf("%s: error in DosGetInfoSeg", progname) ;
      return(1) ;
   }

   plis = MAKEPLINFOSEG(linfo) ;
   itoa(plis->sgCurrent, sga, 10) ;
   strcpy(queue_name, "\\queues\\sg") ;  /* sg prefix - somebody might use PIDs
					    as a name base. We want to minimize
					    risk for a name clash */
   strcat(queue_name, sga) ;

   if (( ret = DosCreateQueue(&hpopresp, QUE_FIFO, queue_name)) != 0)
   {
      fprintf(stderr, "%s: error creating queues...\Exiting...\n", progname ) ;
      return( 1 ) ;
   }

      QueSend("\\queues\\popreq", sga, strlen(sga)+1, 0,"START /C dirserv.exe",progname) ;

     if (( ret = DosReadQueue(hpopresp, &qres, &cbElement, &pmesg, 0, DCWW_WAIT,
		 &bElemprty, NULL)) != 0)
      {
	 return( 1 ) ;
      }

      ptmp = (char *)  pmesg ;
      if (strlen(ptmp) >= 2 && ptmp[1] == ':') /*	drive information present */
      {
	 bufdrive[0] = ptmp[0] ;
	 bufdrive[1] = ptmp[1] ;
	 bufdrive[2] = '\r' ;
	 out_kbd(bufdrive) ;
	 ptmp += 2 ;			/* scan past the drive information */
      }

      strcpy(buf,"cd ") ;
      strcat(buf, ptmp) ;
      strcat(buf,"\r") ;
      out_kbd(buf) ;

      DosFreeSeg(SELECTOROF(pmesg)) ;

   DosCloseQueue(hpopresp) ;
   return( 0 ) ;
}

void out_kbd( char *str )
{
HMONITOR hmon ;
USHORT ret ;
MONIN monin ;
MONOUT monout ;
SEL ginfo, linfo ;
GINFOSEG FAR *pgis ;
USHORT count ;
int i ;

   monin.cb = sizeof(monin) ;
   monout.cb = sizeof(monout) ;

   if (( ret = DosMonOpen("KBD$", &hmon)) != 0)
   {
      printf("%s: error opening monitor", progname) ;
      return ;
   }

   if (( ret = DosGetInfoSeg(&ginfo, &linfo)) != 0)
   {
      printf("%s: error in DosGetInfoSeg", progname) ;
      return ;
   }

   pgis = MAKEPGINFOSEG(ginfo) ;

   if ((ret = DosMonReg(hmon, (PBYTE) &monin, (PBYTE) &monout, MONITOR_DEFAULT, pgis->sgCurrent)) != 0)
   {
      printf("%s: error registering monitor", progname) ;
      return ;
   }

   if ((ret = DosSetPrty(PRTYS_THREAD, PRTYC_TIMECRITICAL, PRTYD_MINIMUM+1, 0)) != 0)
   {
      printf("%s: error raising priority", progname) ;
      return ;
   }

   for ( i=0 ; i < strlen(str) ; i++ )
   {
      count = sizeof(kbdbuf) ;
/*
      if (( ret = DosMonRead( (PBYTE) &monin, DCWW_WAIT, (PBYTE) &kbdbuf, &count )) != 0)
      {
	 printf("%s: error in DosMonRead", progname) ;
	 return ;
      }
*/

      kbdbuf.monflags=0 ;
//   KBDKEYINFO kbdkeyinfo ;
      kbdbuf.ddflags = 0 ;
      kbdbuf.kbdkeyinfo.chChar = str[i] ;
      kbdbuf.kbdkeyinfo.chScan = str[i] ;
      kbdbuf.kbdkeyinfo.fbStatus = 0 ;
      kbdbuf.kbdkeyinfo.bNlsShift = 0 ;
      kbdbuf.kbdkeyinfo.fsState = 0 ;
      kbdbuf.kbdkeyinfo.time = 0 ;

      if (( ret = DosMonWrite( (PBYTE) &monout, (PBYTE) &kbdbuf, count)) != 0)
      {
	 printf("%s: error in DosMonWrite", progname) ;
	 return ;
      }
   }

   DosMonClose(hmon) ;

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -