C400

134. ポインタでプログラムを呼び出す

プログラムを呼び出すのは元々、プログラム名を指定されたときに
そのプログラムのありか(=システム・ポインタ)を探して
ポインタでプログラムを呼び出す仕組みになっている。

プログラム名からそのシステム・ポインタを取得することを
「名前解決」という。

ここで紹介するC言語によるソースはプログラム名から
名前解決してシステム・ポインタによってプログラムを
呼び出す方法を示している。

[ TESTCALL: ポインタでプログラムを呼び出す ]

ソースはこちらから

0001.00 /***********************************************************************/ 
0002.00 /*                                                                     */ 
0003.00 /*   TESTCALL :  任意のプログラムをポインターで呼びだす                */ 
0004.00 /*                                                                     */ 
0005.00 /***********************************************************************/ 
0006.00 #include                                                         
0007.00 #include                                                        
0008.00 #include                                                        
0009.00 #include                                                      
0010.00                                                                           
0011.00 #define TRUE         0                                                    
0012.00 #define FALSE       -1                                                    
0013.00 typedef void (OS_fct_t)(void);                                            
0014.00 #pragma linkage(OS_fct_t, OS);                                            
0015.00                                                                           
0016.00 void main(void){                                                          
0017.00   OS_fct_t* os_fct_ptr;                                                   
0018.00   char  pgmname[10];                                                      
0019.00                                                                           
0020.00   printf(" プログラム名を入れなさい n");                                 
0021.00   scanf("%s", pgmname);                                                   
0022.00                                                                           
0023.00   os_fct_ptr = rslvsp(_Program, pgmname, "*LIBL     ", _AUTH_OBJ_MGMT);   
0019.00                                                                        
0020.00   printf(" プログラム名を入れなさい n");                              
0021.00   scanf("%s", pgmname);                                                
0022.00                                                                        
0023.00   os_fct_ptr = rslvsp(_Program, pgmname, "*LIBL     ", _AUTH_OBJ_MGMT);
0024.00   os_fct_ptr();                                                        
0025.00 }  


                                                                     

[解説]

関数: rslvsp は一般にオブジェクトのシステム・ポインタを取得するためのMI関数である。
つまり rslvsp は MI(=Machine Interface)の関数である。
さてシステム・ポインタが取得できたら

 0024.00   os_fct_ptr();

によってプログラムを呼び出して実行している。

rslvsp(=Resolve System Pointer) の第一パラメータ: _Program はオブジェクト・タイプを
示す 2バイトの識別である。
オブジェクト・タイプ(=10バイト)から この2バイトを識別コードを得るには

API: QLICVTTP を使って

  char   m_OBJTYP[2];
   :
 QLICVTTP("*SYMTOHEX ", "*PNLGRP   ", m_OBJTYP, &errcode);

によって取得することができる。

ソース・メンバー : QSYSINC/MIH(MIOBJTYP) に次のように登録されている。

[ QSYSINC/MIH(MIOBJTYP) ]

0000.76 #ifndef __miobjtyp_h          
0000.77   #define __miobjtyp_h        
0000.78     _Program    = 0x0201,     
0000.79     _Library    = 0x0401,     
0000.80     _Usrspc     = 0x1934,     
0000.81     _Usrq       = 0x0A02,     
0000.82     _Usridx     = 0x0E0A,     
0000.83     WLI_ALRTBL  = 0x0E09,     
0000.84     WLI_AUTL    = 0x1B01,     
0000.85     WLI_BLKSF   = 0x1E05,     
0000.86     WLI_BNDDIR  = 0x1937,     
0000.87     WLI_CFGL    = 0x0E0D,     
0000.88     WLI_CHRSF   = 0x1E06,     
0000.89     WLI_CHTFMT  = 0x190D,     
0000.90     WLI_CLD     = 0x190B,     
0000.91     WLI_CLS     = 0x1904,     
0000.92     WLI_CMD     = 0x1905,     
0000.93     WLI_CNNL    = 0x1701,     
0000.94     WLI_COSD    = 0x1401,     
0000.95     WLI_CRG     = 0x192C,     
0000.96     WLI_CRQD    = 0x0E0F,  
0000.97     WLI_CSI     = 0x1935,  
0000.98     WLI_CSPMAP  = 0x1922,  
0000.99     WLI_CSPTBL  = 0x1923,  
0001.00     WLI_CTLD    = 0x1201,  
0001.01     WLI_DDIR    = 0x1F02,  
0001.02     WLI_DEVD    = 0x1001,  
0001.03     WLI_DIR     = 0x0C01,  
0001.04     WLI_DIR2    = 0x2201,  
0001.05     WLI_DOC     = 0x190E,  
0001.06     WLI_DSTMF   = 0x1F01,  
0001.07     WLI_DTAARA  = 0x190A,  
0001.08     WLI_DTADCT  = 0x1920,  
0001.09     WLI_DTAQ    = 0x0A01,  
0001.10     WLI_EDTD    = 0x1908,  
0001.11     WLI_EXITRG  = 0x1913,  
0001.12     WLI_FCT     = 0x0E04,  
0001.13     WLI_FIFO    = 0x1E07,  
0001.14     WLI_FILE    = 0x1901,  
0001.15     WLI_FLR     = 0x1912,  
0001.16     WLI_FNTRSC  = 0x1926,  
0001.17     WLI_FNTTBL  = 0x192B,  
0001.18     WLI_FORMDF  = 0x1928,  
0001.19     WLI_FTR     = 0x0E0B,  
0001.20     WLI_GSS     = 0x190C,    
0001.21     WLI_IGCDCT  = 0x0E06,    
0001.22     WLI_IGCSRT  = 0x191A,    
0001.23     WLI_IGCTBL  = 0x1910,    
0001.24     WLI_IMGCLG  = 0x192E,    
0001.25     WLI_IPXD    = 0x191E,    
0001.26     WLI_JOBD    = 0x1903,    
0001.27     WLI_JOBQ    = 0x0E01,    
0001.28     WLI_JOBSCD  = 0x0E0C,    
0001.29     WLI_JRN     = 0x0901,    
0001.30     WLI_JRNRCV  = 0x0701,    
0001.31     WLI_LIB     = 0x0401,    
0001.32     WLI_LIND    = 0x1101,    
0001.33     WLI_LOCALE  = 0x1921,    
0001.34     WLI_MEDDFN  = 0x191C,    
0001.35     WLI_MENU    = 0x1916,    
0001.36     WLI_MGTCOL  = 0x192D,    
0001.37     WLI_MODD    = 0x1501,    
0001.38     WLI_MODULE  = 0x0301,    
0001.39     WLI_MSGF    = 0x0E03,    
0001.40     WLI_MSGQ    = 0x1902,    
0001.41     WLI_M36     = 0x1E04,    
0001.42     WLI_M36CFG  = 0x1924,    
0001.43     WLI_NODL    = 0x0E0E,    
0001.44     WLI_NTBD    = 0x1914, 
0001.45     WLI_NWID    = 0x1601, 
0001.46     WLI_NWSCFG  = 0x1939, 
0001.47     WLI_NWSD    = 0x1D01, 
0001.48     WLI_NODGRP  = 0x192A, 
0001.49     WLI_OUTQ    = 0x0E02, 
0001.50     WLI_OVL     = 0x1929, 
0001.51     WLI_PAGDFN  = 0x1936, 
0001.52     WLI_PAGSEG  = 0x1927, 
0001.53     WLI_PDFMAP  = 0x0E11, 
0001.54     WLI_PDG     = 0x1930, 
0001.55     WLI_PGM     = 0x0201, 
0001.56     WLI_PNLGRP  = 0x1915, 
0001.57     WLI_PRDAVL  = 0x1933, 
0001.58     WLI_PRDDFN  = 0x191B, 
0001.59     WLI_PRDLOD  = 0x191D, 
0001.60     WLI_PSFCFG  = 0x1925, 
0001.61     WLI_QMFORM  = 0x1932, 
0001.62     WLI_QMQRY   = 0x1931, 
0001.63     WLI_QRYDFN  = 0x1911, 
0001.64     WLI_RCT     = 0x0E08, 
0001.65     WLI_S36     = 0x1919, 
0001.66     WLI_SBSD    = 0x1909, 
0001.67     WLI_SCHIDX  = 0x0E07, 
0001.68     WLI_SOCKET  = 0x1E03, 
0001.69     WLI_SPADCT  = 0x1C01, 
0001.70     WLI_SQLPKG  = 0x0202, 
0001.71     WLI_SQLUDT  = 0x191F, 
0001.72     WLI_SRVPGM  = 0x0203, 
0001.73     WLI_SSND    = 0x0E05, 
0001.74     WLI_STMF    = 0x1E01, 
0001.75     WLI_SVRSTG  = 0x1917, 
0001.76     WLI_SYMLNK  = 0x1E02, 
0001.77     WLI_TBL     = 0x1906, 
0001.78     WLI_TIMZON  = 0x192F, 
0001.79     WLI_USRPRF  = 0x0801, 
0001.80     WLI_USRIDX  = 0x0E0A, 
0001.81     WLI_USRQ    = 0x0A02, 
0001.82     WLI_USRSPC  = 0x1934, 
0001.83     WLI_VLDL    = 0x0E10, 
0001.84     WLI_WSCST   = 0x1938  
0001.85 #endif                    

この例はIBM iの任意のオブジェクトのシステム・ポインタを取得してオブジェクトを
直接扱うことができることを意味している。
今までは CALL であったりしても名前で呼び出していたのだが今回のTESTCALLは
オブジェクトを直接アクセスできることを意味している。
小さな例であるがこのことが意味することは大きい。
次へのさらなる飛躍に繋がる最初のステップである。