仮想プリンタ・ドライバを製作しているときにプリンターの用紙替えの
メッセージを出力してその応答を受取りたい場合がある。
このような場合は QMHSNDM や QMHSNDPM で QMHRCVM や QMHRCVPM で
応答を受信すればよいかのように思えるが、実はちゃんと専用の
API : QSPSNDWM (赤字)がOS V3R7M0 から用意されている。
次はそのサンプル・ソースである。
[ TESTPRTM : サンプル・ソース ]
0001.00 #include0002.00 #include 0003.00 #include 0004.00 #include 0005.00 0006.00 #define TRUE 0 0007.00 #define FALSE -1 0008.00 typedef struct { 0009.00 int BYTESPRO; 0010.00 int BYTESAVL; 0011.00 char MSGID[7]; 0012.00 char RESRVD; 0013.00 char EXCPDATA[100]; 0014.00 } ERRSTRUCTURE; /* Define the error return structure */ 0015.00 ERRSTRUCTURE errcode;/* Error Code Structure for RCVMSG */ 0016.00 typedef struct { 0017.00 char DEV[10]; 0018.00 char OUTQ[10]; 0019.00 char OUTLIB[10]; 0020.00 char FormType[10]; 0021.00 char WTR[10]; 0022.00 } FORMMSG; 0023.00 FORMMSG formmsg; 0024.00 void ApiError(int LINE, ERRSTRUCTURE* errcode); 0025.00 0026.00 void main(void){ 0027.00 typedef struct { 0028.00 Qsp_SNDM0100_t sndm0100; 0029.00 char Message_Reply_Text[132]; 0030.00 } SNDM0100; 0031.00 SNDM0100 sndm0100; 0032.00 char MSGFFLIB[21], msgdta[132], msgkey[4], WTRHNDL[16], reply[132]; 0033.00 int msgdtalen, timeout = -1, ccsid = 65535, len; 0034.00 0035.00 printf("** TESTPRTM : プリンター・メッセージのテスト **n"); 0036.00 getchar(); 0037.00 0038.00 errcode.BYTESPRO = 160; 0039.00 errcode.BYTESAVL = 0; 0040.00 strcpy(MSGFFLIB, "QCPFMSG QSYS "); 0041.00 memcpy(formmsg.DEV, "LPRDEV ", 10); 0042.00 memcpy(formmsg.OUTQ, "LPRDEV ", 10); 0043.00 memcpy(formmsg.OUTLIB, "QUSRSYS ", 10); 0044.00 memcpy(formmsg.FormType,"*STD ", 10); 0045.00 memcpy(formmsg.WTR, "LPRDEV ", 10); 0046.00 memcpy(msgdta, (char*)&formmsg, msgdtalen); 0047.00 msgdtalen = sizeof(msgdta); 0048.00 QSPSNDWM(&sndm0100, sizeof(sndm0100), "SNDM0100", "CPA3394", MSGFFLIB, 0049.00 msgdta, msgdtalen, "*INQ ", timeout, msgkey, WTRHNDL, ccsid, 0050.00 &errcode); 0051.00 if(errcode.BYTESAVL != 0){/*APIERR*/ 0052.00 printf("[%d] APIERR MSGID = %sn", __LINE__, errcode.MSGID); 0053.00 getchar(); 0054.00 exit(-1); 0055.00 }/*APIERR*/ 0056.00 printf("[%d] ** RETURNED MSG AS FOLLOWS **n", __LINE__); 0057.00 len = sndm0100.sndm0100.Len_Of_Msg_Reply_Text_Avail; 0058.00 memcpy(reply, sndm0100.Message_Reply_Text, len); 0059.00 reply[len] = 0x00; 0060.00 printf("[%d] reply = [%s]n", __LINE__, reply); 0061.00 getchar(); 0062.00 }