The un*x to OS/2-EMX Porting FAQ (pibtst.c)

This is the pibtst.c sampled from The un*x to OS/2-EMX Porting FAQ article. You can also get the file from this link:

 /********************************************************************** * pibtst.c * * Shows how to modify the PIB so that an OS/2 VIO program can * dynamically "morph" into an OS/2 PM program. An interesting * side-effect of the morphing process is that stdout/stdin are still * tied to the VIO window. In other words, printf and gets will * will write to and read from the OS/2 Window from where the program * was started. Of course, reading from stdin inside a window * procedure is not a good idea. * * The modification of the PIB can be moved after the call to * WinInitialize, but must occur before the call to * WinCreateMsgQueue. You can also reset the pib->pib_ultype field to 2 * (the value for an OS/2 VIO session) after the call to * WinCreateMsgQueue without losing the ability to create windows. * You will probably not be able to create a message queue in another * thread if you reset this field, though. * * Note that the PIB being in a read/write area is in fact documented * behavior. See DosGetInfoBlocks in the Control Program Guide and * Reference. * * To compile the program: *   gcc -o pibtst.exe -DMORPH pibtst.c     (EMX) *   icc /Fepibtst.exe /DMORPH pibtst.c     (VACPP or C/Set++) * * Remove the -DMORPH or /DMORPH in the above lines to see how the * program behaves without setting pib->pib_ultype. * * Darren Abbott * abbott@hiwaay.net * * The included binary was created by: *   gcc -DMORPH -O3 -s -o pibtst.exe pibtst.c -Zmt -Zsys -Zomf -Zsmall-conv * *********************************************************************/


 * 1) include 
 * 2) include 


 * 1) define INCL_DOSPROCESS
 * 2) define INCL_WINWINDOWMGR
 * 3) define INCL_WIMMESSAGEMGR
 * 4) define INCL_WINDIALOGS
 * 5) include 

static MRESULT EXPENTRY ClientWndProc(HWND hwnd, ULONG msg,				     MPARAM mp1, MPARAM mp2); int main(void) { HAB hab; HMQ hmq; PPIB pib; PTIB tib; BOOL rc; HWND hwndFrame; HWND hwndClient; ULONG fcf; QMSG qmsg; char input[80]; char className[] = "TestClass.Win";

DosGetInfoBlocks(&tib, &pib); printf("pib->pib_ultype = %d\n", pib->pib_ultype);

/* Try morphing into a PM application. */  pib->pib_ultype = 3; printf("pib->pib_ultype = %d\n", pib->pib_ultype);
 * 1) ifdef MORPH
 * 1) endif

hab = WinInitialize(0); printf("hab = %d\n", hab);

hmq = WinCreateMsgQueue(hab, 0); printf("hmq = %d\n", hmq); printf("Type enter to continue\n"); gets(input);

/* Create a simple window. */  rc = WinRegisterClass(hab, className, ClientWndProc, CS_SIZEREDRAW, 0L); if (!rc) { printf("WinRegisterClass failed\n"); }

fcf = FCF_TASKLIST | FCF_SYSMENU | FCF_SIZEBORDER | FCF_SHELLPOSITION | FCF_TITLEBAR | FCF_MINBUTTON; hwndFrame = WinCreateStdWindow(HWND_DESKTOP, WS_VISIBLE,                                 &fcf, className, "Test",                                  0L, 0, 1, &hwndClient);

if (!hwndFrame) { printf("WinCreateStdWindow error\n"); }

printf("%s: %d\n", __FILE__, __LINE__);

while (WinGetMsg(hab, &qmsg, 0L, 0, 0)) WinDispatchMsg(hab, &qmsg);

WinDestroyWindow(hwndFrame); WinDestroyMsgQueue(hmq); WinTerminate(hab);

printf("%s: %d\n", __FILE__, __LINE__); return 0; }

static MRESULT EXPENTRY ClientWndProc(HWND hwnd, ULONG msg,				     MPARAM mp1, MPARAM mp2) { HPS hps; RECTL rcl; static char codeName[80] = { "Test Window" };

switch (msg) { case WM_CREATE: printf("WM_CREATE\n"); break;

case WM_CLOSE: printf("WM_CLOSE\n"); WinPostMsg(hwnd, WM_QUIT, 0, 0); break; case WM_PAINT: printf("WM_PAINT\n"); hps = WinBeginPaint(hwnd, NULLHANDLE, NULL); WinQueryWindowRect(hwnd, &rcl); GpiSetColor(hps, CLR_DARKCYAN); WinDrawText(hps, -1, codeName, &rcl, 0, 0,                    DT_TEXTATTRS | DT_CENTER | DT_VCENTER | DT_ERASERECT); WinEndPaint(hps); break; default: return WinDefWindowProc(hwnd, msg, mp1, mp2); }  return 0; }

