win main

[戻る]
女王 2007/01/03(水) 22:39:21
猫でもわかるからのコピペですが、
WinMainの引数、HANDLE 型になってますがあってるんでしょうか?
borlandのコンパイラ、bcc developerでは、エラーになります。

#include <windows.h>
#include <time.h>
#include <stdio.h>

int WINAPI WinMain( HANDLE hInstance , 
        HANDLE hPrevInstance , LPSTR  lpCmdLine , int  nCmdShow )
{
    int hr, mn, sec, ret;
    char str[256];
    char *str_org = "ただいま%3d時%3d分%3d秒です";
    struct tm *mytime;
    time_t long_time;
    
    while(1) {
        time(&long_time);
        mytime = localtime(&long_time);
        hr = mytime->tm_hour;
        mn = mytime->tm_min;
        sec = mytime->tm_sec;
        sprintf(str, str_org, hr, mn, sec);

        ret = MessageBox(NULL,
            (LPCSTR)str,
            (LPCSTR)"猫でもわかるプログラミング",
            MB_OKCANCEL);
        if (ret == IDCANCEL)
            break;
    }
    return 0;
}

joan 2007/01/04(木) 01:51:25
VC2003でC++でコンパイルしてみましたが、コンパイルエラーになりました。

> error C2731: 'WinMain' : 関数はオーバーロードできません。
>               'WinMain' の宣言を確認してください。
> 1 番目の引数を 'HANDLE' から 'HINSTANCE' に変換できません。
        'void*' から非 'void' 型への変換には明示的なキャストが必要です。

HANDLE のところを HINSTANCE に置き換えないとやっぱりダメじゃないですかね。

Win32APIのリファレンスにも HINSTANCE  になってますし。
http://msdn.microsoft.com/library/ja/default.asp?
url=/library/ja/jpwinui/html/_win32_winmain.asp

超初心者 2007/01/04(木) 08:04:15
ハンドルは汎用的でウィンドウハンドル、ファイルハンドル、セマフォもハンドル。
前は、typedefなのでコンパイルエラーにならない。
今は、ミスを減らすために構造体にしてコンパイルエラーを出すように変えた。

Ban 2007/01/05(金) 04:05:14
> 前は、typedefなのでコンパイルエラーにならない。
> 今は、ミスを減らすために構造体にしてコンパイルエラーを出すように変えた。

一応後方互換のために、windows.hの前にSTRICTマクロがある時に後者になります。

# 猫の時代のコードは、多分この定義がなかったのでしょう。

女王 2007/01/05(金) 18:33:30
[[解決]]
どうも!みなさん、参考になりました!
ありがとうございます!

古いスレッドには追加発言できません。