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 ここまで----