プログラムを呼び出すのは元々、プログラム名を指定されたときに
そのプログラムのありか(=システム・ポインタ)を探して
ポインタでプログラムを呼び出す仕組みになっている。
プログラム名からそのシステム・ポインタを取得することを
「名前解決」という。
ここで紹介するC言語によるソースはプログラム名から
名前解決してシステム・ポインタによってプログラムを
呼び出す方法を示している。
[ TESTCALL: ポインタでプログラムを呼び出す ]
ソースはこちらから
0001.00 /***********************************************************************/ 0002.00 /* */ 0003.00 /* TESTCALL : 任意のプログラムをポインターで呼びだす */ 0004.00 /* */ 0005.00 /***********************************************************************/ 0006.00 #include0007.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は
オブジェクトを直接アクセスできることを意味している。
小さな例であるがこのことが意味することは大きい。
次へのさらなる飛躍に繋がる最初のステップである。