MinGWで_tmain()を使用する方法 - Frost Moon Project
アクセスランキング
Home >
Tips >
MinGWで_tmain()を使用する方法
MinGWで_tmain()を使用する方法
問題
解決方法
問題
現在、MinGWではワイド文字引数を扱うwmain()を使用することが出来ません。
これはtchar.hにもあるように、Unicode用のスタートアップモジュールが実装されていない為です。
以下は_tmain()に渡された引数argvを表示するだけのコードですが、
UNICODEビルドの為、エラーが出てしまいます。
C:\msys\home\Owner\works>g++ tmain.cpp -o tmain
c:/msys/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../libmingw32.a(main.o): In function `main':
C:\MinGW\msys\1.0\src\mingwrt/../mingw/main.c:73: undefined reference to `WinMain@16'
collect2: ld returned 1 exit status
そこで、考えられるのはCommandLineToArgvW() とGetCommandLine() の組み合わせで引数を取得する方法です。
しかし、この方法ではワイルドカードが展開されません。
ANSIビルドのmain()と同じように展開出来ないものでしょうか?
解決方法
MinGWで引数のワイルドカードが展開されてしまうのを防ぐ方法 にも登場した__getmainargs()/__wgetmainargs() を使用します。
__getmainargs()/__wgetmainargs()は引数の_DoWildCardを1 とすることで、ワイルドカードの展開を行うことが出来ます。
int __wgetmainargs(
int * _Argc,
wchar_t *** _Argv,
wchar_t *** _Env,
int _DoWildCard,
_startupinfo * _StartInfo);
今回は_UNICODEが定義されているかどうかで処理を分岐することでANSI/UNICODEビルドのどちらでも利用できるようになっています。
無事、ワイルドカードの展開を行う_tmain()を使用することが出来ました。
因みに、展開するかどうかMinGWに任せる場合は"extern int _CRT_glob;"を適当な行に追加し、
_DoWildCardの部分を_CRT_globとします。
関連Tips
MinGWで引数のワイルドカードが展開されてしまうのを防ぐ方法
Copyright(C)Frost Moon Project
Home >
Tips >
MinGWで_tmain()を使用する方法