Frost Moon Project

MinGWで引数のワイルドカードが展開されてしまうのを防ぐ方法 - Frost Moon Project アクセスランキング

Home > Tips > MinGWで引数のワイルドカードが展開されてしまうのを防ぐ方法

MinGWで引数のワイルドカードが展開されてしまうのを防ぐ方法

  1. 問題
  2. 解決方法

問題
以下はmain()に渡された引数argvを表示するだけのコードです。
引数argvを表示
1
2
3
4
5
6
7
8
9
#include <windows.h>
 
int main(int argc,char* argv[]){
    for(int i=0;i<argc;i++){
        MessageBox(NULL,argv[i],NULL,MB_OK);
    }
    return 0;
}
        


これをVisual C++ 2010 Expression Editionでビルドして実行すると、画像の様にワイルドカードは展開されません。

※分かりやすくするためMessageBox()のタイトルを変更しています

一方、TDM-GCCでビルドして実行すると、ワイルドカードが展開されてしまいます。

解決方法
引数の解析を行う__getmainargs()を直接呼び出します。
この時、_DoWildCardを0とすることで、ワイルドカードの展開を防ぐことが出来ます。
int __getmainargs(
int * _Argc,
char *** _Argv,
char *** _Env,
int _DoWildCard,
_startupinfo * _StartInfo);


今回は引数取得をmain()で行い、従来のmain()の処理を_main()で行います。
ワイルドカード展開抑止
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <windows.h>
 
 
#ifdef __cplusplus
extern "C"
#endif
 
void __getmainargs(int*,char***,char***,int,int*);
 
int _main(int argc,char* argv[]){
    for(int i=0;i<argc;i++){
        MessageBox(NULL,argv[i],NULL,MB_OK);
    }
    return 0;
}
 
int main(){
    char** argv;
    char** enpv;
    int argc=0,si=0;
    __getmainargs(&argc,&argv,&enpv,0,&si);
    return _main(argc,argv);
}
        


無事、ワイルドカードの展開を防ぐことが出来ました。


因みに、展開するかどうかMinGWに任せる場合は"extern int _CRT_glob;"を適当な行に追加し、
_DoWildCardの部分を_CRT_globとします。
関連Tips
MinGWで_tmain()を使用する方法

Copyright(C) 2007-2025 Frost Moon Project


Home > Tips > MinGWで引数のワイルドカードが展開されてしまうのを防ぐ方法