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

📄 process.xs

📁 UNIX下perl实现代码
💻 XS
字号:
#include "EXTERN.h"#include "perl.h"#include "XSUB.h"#include <process.h>#define INCL_DOS#define INCL_DOSERRORS#include <os2.h>static unsigned longconstant(char *name, int arg){    errno = 0;    if (name[0] == 'P' && name[1] == '_') {	if (strEQ(name, "P_BACKGROUND"))#ifdef P_BACKGROUND	    return P_BACKGROUND;#else	    goto not_there;#endif	if (strEQ(name, "P_DEBUG"))#ifdef P_DEBUG	    return P_DEBUG;#else	    goto not_there;#endif	if (strEQ(name, "P_DEFAULT"))#ifdef P_DEFAULT	    return P_DEFAULT;#else	    goto not_there;#endif	if (strEQ(name, "P_DETACH"))#ifdef P_DETACH	    return P_DETACH;#else	    goto not_there;#endif	if (strEQ(name, "P_FOREGROUND"))#ifdef P_FOREGROUND	    return P_FOREGROUND;#else	    goto not_there;#endif	if (strEQ(name, "P_FULLSCREEN"))#ifdef P_FULLSCREEN	    return P_FULLSCREEN;#else	    goto not_there;#endif	if (strEQ(name, "P_MAXIMIZE"))#ifdef P_MAXIMIZE	    return P_MAXIMIZE;#else	    goto not_there;#endif	if (strEQ(name, "P_MINIMIZE"))#ifdef P_MINIMIZE	    return P_MINIMIZE;#else	    goto not_there;#endif	if (strEQ(name, "P_NOCLOSE"))#ifdef P_NOCLOSE	    return P_NOCLOSE;#else	    goto not_there;#endif	if (strEQ(name, "P_NOSESSION"))#ifdef P_NOSESSION	    return P_NOSESSION;#else	    goto not_there;#endif	if (strEQ(name, "P_NOWAIT"))#ifdef P_NOWAIT	    return P_NOWAIT;#else	    goto not_there;#endif	if (strEQ(name, "P_OVERLAY"))#ifdef P_OVERLAY	    return P_OVERLAY;#else	    goto not_there;#endif	if (strEQ(name, "P_PM"))#ifdef P_PM	    return P_PM;#else	    goto not_there;#endif	if (strEQ(name, "P_QUOTE"))#ifdef P_QUOTE	    return P_QUOTE;#else	    goto not_there;#endif	if (strEQ(name, "P_SESSION"))#ifdef P_SESSION	    return P_SESSION;#else	    goto not_there;#endif	if (strEQ(name, "P_TILDE"))#ifdef P_TILDE	    return P_TILDE;#else	    goto not_there;#endif	if (strEQ(name, "P_UNRELATED"))#ifdef P_UNRELATED	    return P_UNRELATED;#else	    goto not_there;#endif	if (strEQ(name, "P_WAIT"))#ifdef P_WAIT	    return P_WAIT;#else	    goto not_there;#endif	if (strEQ(name, "P_WINDOWED"))#ifdef P_WINDOWED	    return P_WINDOWED;#else	    goto not_there;#endif    } else if (name[0] == 'T' && name[1] == '_') {	if (strEQ(name, "FAPPTYP_NOTSPEC"))#ifdef FAPPTYP_NOTSPEC	    return FAPPTYP_NOTSPEC;#else	    goto not_there;#endif	if (strEQ(name, "T_NOTWINDOWCOMPAT"))#ifdef FAPPTYP_NOTWINDOWCOMPAT	    return FAPPTYP_NOTWINDOWCOMPAT;#else	    goto not_there;#endif	if (strEQ(name, "T_WINDOWCOMPAT"))#ifdef FAPPTYP_WINDOWCOMPAT	    return FAPPTYP_WINDOWCOMPAT;#else	    goto not_there;#endif	if (strEQ(name, "T_WINDOWAPI"))#ifdef FAPPTYP_WINDOWAPI	    return FAPPTYP_WINDOWAPI;#else	    goto not_there;#endif	if (strEQ(name, "T_BOUND"))#ifdef FAPPTYP_BOUND	    return FAPPTYP_BOUND;#else	    goto not_there;#endif	if (strEQ(name, "T_DLL"))#ifdef FAPPTYP_DLL	    return FAPPTYP_DLL;#else	    goto not_there;#endif	if (strEQ(name, "T_DOS"))#ifdef FAPPTYP_DOS	    return FAPPTYP_DOS;#else	    goto not_there;#endif	if (strEQ(name, "T_PHYSDRV"))#ifdef FAPPTYP_PHYSDRV	    return FAPPTYP_PHYSDRV;#else	    goto not_there;#endif	if (strEQ(name, "T_VIRTDRV"))#ifdef FAPPTYP_VIRTDRV	    return FAPPTYP_VIRTDRV;#else	    goto not_there;#endif	if (strEQ(name, "T_PROTDLL"))#ifdef FAPPTYP_PROTDLL	    return FAPPTYP_PROTDLL;#else	    goto not_there;#endif	if (strEQ(name, "T_32BIT"))#ifdef FAPPTYP_32BIT	    return FAPPTYP_32BIT;#else	    goto not_there;#endif    }    errno = EINVAL;    return 0;not_there:    errno = ENOENT;    return 0;}const char* const ptypes[] = { "FS", "DOS", "VIO", "PM", "DETACH" };static char *my_type(){    int rc;    TIB *tib;    PIB *pib;        if (!(_emx_env & 0x200)) return (char*)ptypes[1]; /* not OS/2. */    if (CheckOSError(DosGetInfoBlocks(&tib, &pib))) 	return NULL;         return (pib->pib_ultype <= 4 ? (char*)ptypes[pib->pib_ultype] : "UNKNOWN");}static ULONGfile_type(char *path){    int rc;    ULONG apptype;        if (!(_emx_env & 0x200)) 	croak("file_type not implemented on DOS"); /* not OS/2. */    if (CheckOSError(DosQueryAppType(path, &apptype))) {	if (rc == ERROR_INVALID_EXE_SIGNATURE) 	    croak("Invalid EXE signature"); 	else if (rc == ERROR_EXE_MARKED_INVALID) {	    croak("EXE marked invalid"); 	}	croak("DosQueryAppType err %ld", rc);     }        return apptype;}static voidfill_swcntrl(SWCNTRL *swcntrlp){	 int rc;	 PTIB ptib;	 PPIB ppib;	 HSWITCH hSwitch;    	 HWND hwndMe;	 if (!(_emx_env & 0x200)) 	     croak("switch_entry not implemented on DOS"); /* not OS/2. */	 if (CheckOSError(DosGetInfoBlocks(&ptib, &ppib)))	     croak("DosGetInfoBlocks err %ld", rc);	 if (CheckWinError(hSwitch = 			   WinQuerySwitchHandle(NULLHANDLE, 						(PID)ppib->pib_ulpid)))	     croak("WinQuerySwitchHandle err %ld", Perl_rc);	 if (CheckOSError(WinQuerySwitchEntry(hSwitch, swcntrlp)))	     croak("WinQuerySwitchEntry err %ld", rc);}/* static ULONG (* APIENTRY16 pDosSmSetTitle)(ULONG, PSZ); */ULONG _THUNK_FUNCTION(DosSmSetTitle)(ULONG, PSZ);#if 0			/*  Does not work.  */static ULONG (*pDosSmSetTitle)(ULONG, PSZ);static voidset_title(char *s){    SWCNTRL swcntrl;    static HMODULE hdosc = 0;    BYTE buf[20];    long rc;    fill_swcntrl(&swcntrl);    if (!pDosSmSetTitle || !hdosc) {	if (CheckOSError(DosLoadModule(buf, sizeof buf, "sesmgr", &hdosc)))	    croak("Cannot load SESMGR: no `%s'", buf);	if (CheckOSError(DosQueryProcAddr(hdosc, 0, "DOSSMSETTITLE",					  (PFN*)&pDosSmSetTitle)))	    croak("Cannot load SESMGR.DOSSMSETTITLE, err=%ld", rc);    }/*     (pDosSmSetTitle)(swcntrl.idSession,s); */    rc = ((USHORT)          (_THUNK_PROLOG (2+4);           _THUNK_SHORT (swcntrl.idSession);           _THUNK_FLAT (s);           _THUNK_CALLI (*pDosSmSetTitle)));    if (CheckOSError(rc))	warn("*DOSSMSETTITLE: err=%ld, ses=%ld, addr=%x, *paddr=%x", 	     rc, swcntrl.idSession, &_THUNK_FUNCTION(DosSmSetTitle),	     pDosSmSetTitle);}#else /* !0 */static boolset_title(char *s){    SWCNTRL swcntrl;    static HMODULE hdosc = 0;    BYTE buf[20];    long rc;    fill_swcntrl(&swcntrl);    rc = ((USHORT)          (_THUNK_PROLOG (2+4);           _THUNK_SHORT (swcntrl.idSession);           _THUNK_FLAT (s);           _THUNK_CALL (DosSmSetTitle)));#if 0    if (CheckOSError(rc))	warn("DOSSMSETTITLE: err=%ld, ses=%ld, addr=%x", 	     rc, swcntrl.idSession, _THUNK_FUNCTION(DosSmSetTitle));#endif    return !CheckOSError(rc);}#endif /* !0 */#if 0			/*  Does not work.  */USHORT _THUNK_FUNCTION(Win16SetTitle) ();static voidset_title2(char *s){    long rc;    rc = ((USHORT)          (_THUNK_PROLOG (4);           _THUNK_FLAT (s);           _THUNK_CALL (Win16SetTitle)));    if (CheckWinError(rc))	warn("Win16SetTitle: err=%ld", rc);}#endifMODULE = OS2::Process		PACKAGE = OS2::Processunsigned longconstant(name,arg)	char *		name	int		argchar *my_type()U32file_type(path)    char *pathU32process_entry()    PPCODE:     {	 SWCNTRL swcntrl;	 fill_swcntrl(&swcntrl);	 EXTEND(sp,9);	 PUSHs(sv_2mortal(newSVpv(swcntrl.szSwtitle, 0)));	 PUSHs(sv_2mortal(newSVnv(swcntrl.hwnd)));	 PUSHs(sv_2mortal(newSVnv(swcntrl.hwndIcon)));	 PUSHs(sv_2mortal(newSViv(swcntrl.hprog)));	 PUSHs(sv_2mortal(newSViv(swcntrl.idProcess)));	 PUSHs(sv_2mortal(newSViv(swcntrl.idSession)));	 PUSHs(sv_2mortal(newSViv(swcntrl.uchVisibility != SWL_INVISIBLE)));	 PUSHs(sv_2mortal(newSViv(swcntrl.uchVisibility == SWL_GRAYED)));	 PUSHs(sv_2mortal(newSViv(swcntrl.fbJump == SWL_JUMPABLE)));	 PUSHs(sv_2mortal(newSViv(swcntrl.bProgType)));     }boolset_title(s)    char *s

⌨️ 快捷键说明

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