000010 @OPTIONS ALPHAL(WORD)
000020*=================================================================
000030* This sample program demonstrates how to execute other programs
000040* and batch files.
000050*
000060*
000070* Copyright 2000-2010 FUJITSU LIMITED
000080*=================================================================
000090 IDENTIFICATION DIVISION.
000100 PROGRAM-ID. SAMPLE32.
000110 DATA DIVISION.
000120 WORKING-STORAGE SECTION.
000130 01 ProcessInfo.
000140 02 prcinf01 PIC 9(9) COMP-5.
000150 02 prcinf02 PIC 9(9) COMP-5.
000160 02 prcinf03 PIC 9(9) COMP-5.
000170 02 prcinf04 PIC 9(9) COMP-5.
000180 01 StartupInfo.
000190 02 stainf01 PIC 9(9) COMP-5.
000200*
000210 02 stainf02 PIC 9(9) COMP-5.
000220 02 stainf03 PIC 9(9) COMP-5.
000230 02 stainf04 PIC 9(9) COMP-5.
000240*
000250 02 stainf05 PIC 9(9) COMP-5.
000260 02 stainf06 PIC 9(9) COMP-5.
000270 02 stainf07 PIC 9(9) COMP-5.
000280 02 stainf08 PIC 9(9) COMP-5.
000290 02 stainf09 PIC 9(9) COMP-5.
000300 02 stainf10 PIC 9(9) COMP-5.
000310 02 stainf11 PIC 9(9) COMP-5.
000320 02 stainf12 PIC 9(9) COMP-5.
000330 02 stainf13 PIC 9(4) COMP-5.
000340 02 stainf14 PIC 9(4) COMP-5.
000350 02 stainf15 PIC 9(9) COMP-5.
000360*
000370 02 stainf16 PIC 9(9) COMP-5.
000380 02 stainf17 PIC 9(9) COMP-5.
000390 02 stainf18 PIC 9(9) COMP-5.
000400 01 appPath PIC X(256) VALUE SPACE.
000410 01 pathLeng PIC S9(9) COMP-5.
000420 01 cmdline PIC X(256) VALUE SPACE.
000430 01 cmdlinLeng PIC S9(9) COMP-5.
000440 01 rtncd PIC 9(9) COMP-5.
000450 CONSTANT SECTION.
000460 01 ZDEFAULT PIC X(22) VALUE "..\SAMPLE31\MSGBOX.EXE".
000470 PROCEDURE DIVISION.
000480*=================================================================
000490* Get the path name of the program or batch file to execute.
000500*=================================================================
000510 DISPLAY " Input the path name that execution program.".
000520 DISPLAY " (If input no character, then execute the MsgBox.EXE of SAMPLE31)".
000530 DISPLAY " => " WITH NO ADVANCING.
000540 ACCEPT appPath FROM CONSOLE.
000550 COMPUTE pathLeng = FUNCTION STORED-CHAR-LENGTH(appPath)
000560*=================================================================
000570* If nothing is input,
000580* then use the default path name ("..\SAMPLE31\MSGBOX.EXE").
000590*=================================================================
000600 IF pathLeng = 0 THEN
000610 COMPUTE pathLeng = FUNCTION LENGTH (ZDEFAULT)
000620 MOVE ZDEFAULT TO appPath
000630 MOVE 0 TO cmdlinLeng
000640 ELSE
000650*=================================================================
000660* If the path name is input,
000670* then get the command line arguments.
000680*=================================================================
000690 DISPLAY " Input the command line arguments."
000700 DISPLAY " => " WITH NO ADVANCING
000710 ACCEPT cmdline FROM CONSOLE
000720 COMPUTE cmdlinLeng = FUNCTION STORED-CHAR-LENGTH(cmdline)
000730 MOVE LOW-VALUE TO cmdline(cmdlinLeng + 1:1)
000740 END-IF
000750 MOVE LOW-VALUE TO appPath(pathLeng + 1:1)
000760*=================================================================
000770* Execute the program using the CreateProcessA function.
000780*=================================================================
000790 DISPLAY "Execute the program " appPath(1:pathLeng)
000800 IF cmdlinLeng = 0 THEN
000810 *> If do not need command line arguments.
000820 CALL "CreateProcessA" WITH STDCALL LINKAGE
000830 USING BY REFERENCE appPath
000840 BY VALUE 0
000850 BY VALUE 0
000860 BY VALUE 0
000870 BY VALUE 0
000880 BY VALUE 0
000890 BY VALUE 0
000900 BY VALUE 0
000910 BY REFERENCE StartupInfo
000920 BY REFERENCE ProcessInfo
000930 RETURNING rtncd
000940 ELSE
000950 *> If need command line arguments.
000960 CALL "CreateProcessA" WITH STDCALL LINKAGE
000970 USING BY REFERENCE appPath
000980 BY REFERENCE cmdline
000990 BY VALUE 0
001000 BY VALUE 0
001010 BY VALUE 0
001020 BY VALUE 0
001030 BY VALUE 0
001040 BY VALUE 0
001050 BY REFERENCE StartupInfo
001060 BY REFERENCE ProcessInfo
001070 RETURNING rtncd
001080 END-IF
001090*
001100*=================================================================
001110* CreateProcessA succeed.
001120*=================================================================
001130 IF rtncd = 1 THEN
001140 DISPLAY "Succeeded in executing program " appPath(1:pathLeng)
001150 CALL "WaitForSingleObject" WITH STDCALL LINKAGE
001160 USING BY VALUE prcinf01 -1
001170 CALL "GetExitCodeProcess" WITH STDCALL LINKAGE
001180 USING BY VALUE prcinf01
001190 BY REFERENCE rtncd
001200*=================================================================
001210* Free all resources.
001220*=================================================================
001230 CALL "CloseHandle" WITH STDCALL LINKAGE
001240 USING BY VALUE prcinf01
001250 CALL "CloseHandle" WITH STDCALL LINKAGE
001260 USING BY VALUE prcinf02
001270 DISPLAY "Return code from " appPath(1:pathLeng) " is '" RTNCD "'."
001280*
001290*=================================================================
001300* CreateProcessA failed.
001310*=================================================================
001320 ELSE
001330 CALL "GetLastError" WITH STDCALL LINKAGE
001340 RETURNING rtncd
001350 DISPLAY "Failed in execution " appPath(1:pathLeng)
001360 DISPLAY "Return code is '" RTNCD "'."
001370 END-IF.
001380 STOP RUN.
Marcadores