[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: [MD:7632] 現在の配布バイナリのコンパイラは?



2009年9月12日11:11 M.Fujii <boochang@xxxxxxxxxxxx>:
> 藤井です。書き忘れたので補足です。
>
> __argc, __argv を使うとコマンドライン文字列のパースが emacsclientw の仕
> 様に沿っているかが問題となります。__argv などを使うよう適用するのは
> 比較的楽だと思いますが、この辺の検証をやるのは大変かもしれません。

ほんとだ、__argc, __argvは使えますね。しらなかった。
msvc と mingwで以下のコード(chkarg.c)をコンパイルしてみて軽く試してみた。
解釈の仕方はおんなじに見える。

[コンパイル]
  cl chkarg.c /Fechkarg-msvc.exe /link /subsystem:windows
or
  gcc -o chkarg-mingw.exe chkarg.c -mwindows -lkernel32

[起動コマンドライン(共通)]
chkarg '(\a "b c")' "(\"d\" \"c:\home\gotoh\")"

[mingwの場合の出力結果]
argc=4
argv[0] = 'chkarg-mingw'
argv[1] = ''(\a'
argv[2] = 'b c)''
argv[3] = '("d" "c:\home\gotoh")'

[msvcの場合の出力結果]
in WinMain
'(\a "b c")' "(\"d\" \"c:\home\gotoh\")"
argc=4
argv[0] = 'chkarg-msvc'
argv[1] = ''(\a'
argv[2] = 'b c)''
argv[3] = '("d" "c:\home\gotoh")'



----------[chkarg.c]----------
#ifndef __GNUC__
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPervInstance,
                 LPSTR lpszCmdLine, int nCmdShow)

{
    OutputDebugString("abc\n");
    OutputDebugString(lpszCmdLine);
    return main(__argc, __argv);
}
#else
#endif

int
main(int argc, char **argv)
{
    char buf[80];
    int i;
    sprintf(buf, "argc=%d\n", argc);
    OutputDebugString(buf);
    for (i=0; i<argc; i++) {
	sprintf(buf, "argv[%d] = '%s'\n", i, argv[i]);
	OutputDebugString(buf);
    }
}

-
Shun-ichi GOTO