PMプログラムのメイン関数はほとんど約束事の世界ですので、 本体のファイルはだいたい使い回しています。 とりあえずは、こんなファイルを用意しておきます。 中身は、まああまり考える必要はないでしょう。
それでも先頭にコメントを入れるとプログラミングが始まった、 という気分になります。 シェイプウィンドウを使いますので、ヘッダを追加しておきます。
余分に関数が二つばかり紛れ込んでいますが、デバッグサポート用 でいつも使う手のものです。
また、共通定義用のヘッダファイル「romy.h」も入れておきます。 こちらは今の段階では特に中身はありません。 とりあえずは、デバッグ用のマクロなんかを入れておきます。
念のため: まだウィンドウを作っていないので、 この段階でコンパイルしても動きません。 メッセージループをコメントアウトしておくと、 起動はできます(すぐに終了しますが)。
----romy.h ここから----/* * romy.h - Global Definitions */ #ifndef _ROMY_H #define _ROMY_H #ifdef DEBUG #define TRACE printf #else #define TRACE #endif #endif /* _ROMY_H */----romy.h ここまで----
----romy.c ここから----
/* * romy.c - Mr Romy watchs you */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define INCL_PM #include <os2.h> #include "shapewin.h" #include "romy.h" /* * myname - adjust and save program names */ UCHAR ProgramPath[256] ; UCHAR ProgramName[256] ; static void myname(PSZ me) { PUCHAR p, last ; /* * full pathname of program */ for (p = me, last = NULL ; *p ; p++) { if (*p == '/' || *p == '\\') { last = p ; } } if (last != NULL) { strcpy(ProgramPath, me) ; } else if (DosSearchPath(7, "PATH", me, ProgramPath, 256) != 0) { strcpy(ProgramPath, me) ; } /* * basename of program */ for (p = ProgramPath, last = NULL ; *p ; p++) { if (*p == '/' || *p == '\\') { last = p ; } } if (last == NULL) { strcpy(ProgramName, ProgramPath) ; } else { strcpy(ProgramName, &last[1]) ; } if ((p = strrchr(ProgramName, '.')) != NULL) { *p = '\0' ; } } /* * Error Notify */ void trMessage(PSZ msg) { WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, msg, ProgramName, 0, MB_OK) ; } /* * main - program start here */ int main(int ac, char *av[]) { HAB hab ; HMQ hmq ; QMSG qmsg ; myname(av[0]) ; _wildcard(&ac, &av) ; hab = WinInitialize(0) ; hmq = WinCreateMsgQueue(hab, 0) ; /* * Start Window Processing */ while (WinGetMsg(hab, &qmsg, 0, 0, 0)) { WinDispatchMsg(hab, &qmsg) ; } /* * dispose resources */ WinDestroyMsgQueue(hmq) ; WinTerminate(hab) ; return 0 ; }----romy.c ここまで----