Akira's Commentary


最初はいつものテンプレート

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