Visual Studio 2008 Express Edition 日本語版2008年03月07日 02時05分46秒

Visual Studio 2008 Express Edition 日本語版(無償) は以下から入手可能です。

http://www.microsoft.com/japan/msdn/vstudio/express/

Visual C++ 2008 Express Edition には、Windows Platform SDK も同梱されています。

Windows Vista 問題改め msvcr8x, msvcr9x 問題2008年03月07日 02時12分42秒

当初、MinGw でコンパイルした namazu.exe が Windows Vista で正常動作しないため、Vista 問題としていました msvcr8x 問題ですが、Visual C++ 2008 でコンパイルするとどうなるか確認してみました。

VC++ 2008 でコンパイルしたバイナリは msvcr9x に依存します。 この msvcr9x も msvcr8x 同様の不具合が生じました。 このため、VC++ 2008 もそのままでは namazu.exe のコンパイルには使えそうにありませんでした。

VC++ と msvcr のバージョンの関係は次の通りです。

  • Visual C++ 6.0 は msvcr60
  • Visual C++ .NET は msvcr70
  • Visual C++ .NET 2003 は msvcr71
  • Visual C++ 2005 は msvcr8x
  • Visual C++ 2008 は msvcr9x

namazu.exe で不具合が生じるのは msvcr[80]x です。 このため、VC++ .NET 2003 以前でスタティックリンクすればこの問題を回避できます。 このため、今のところ VC++ 6.0 でコンパイルしています。

Namazu 2.0.18RC3 公開 + 動作チェックに協力していただける方募集2008年03月07日 04時18分39秒

Namazu 2.0.18 のリリースを予定しております。

それに先立ち、Namazu 2.0.18RC3 を公開いたします。 この Namazu 2.0.18RC3 のコンパイル + 動作チェックをしていただける方を広く募集しておりますので、皆様ご参加のほどよろしくお願いします。

  • アーカイブファイル

http://www.namazu.org/test/namazu-2.0.18RC3.tar.gz

  • 署名ファイル

http://www.namazu.org/test/namazu-2.0.18RC3.tar.gz.sig

  • MD5sumファイル

http://www.namazu.org/test/namazu-2.0.18RC3.tar.gz.md5

(MD5sum: ed450d3332cd84ec21239f5d1aeb5976)

  • sha1sumファイル

http://www.namazu.org/test/namazu-2.0.18RC3.tar.gz.sha1

(sha1sum: d812c554d75ed608be9264343131afb9030d91b7)

<2.0.18RC2 からの変更点>

  • doc 以下を修正
  • Windows 版でコンパイル時にワーニングが発生する部分にキャストを追加、変数の型を変更、ヘッダの追加等

Windows ネイティブ版 Namazu 2.0.18RC3 公開2008年03月07日 06時01分14秒

Namazu 2.0.18 をリリースするにあたり、様々な環境での動作チェックを行う必要があるかと思っています。 このため動作チェックに協力していただけるボランティアを募集いたします。

Windows 環境で、コンパイル環境を整えるのは大変かと思いますので、コンパイル済みパッケージを用意しました。 皆様、ふるってご参加ください。

  • アーカイブファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.001-win32.zip

  • 署名ファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.001-win32.zip.sig

  • MD5sumファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.001-win32.zip.md5

(md5: 5e839ed2875ca869c2f9faae781ba3f1)

  • sha1sumファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.001-win32.zip.sha1

(sha1: eb010fdb04428abf6574aeb4654cd80f7d33c706)

<2.0.18RC2 からの変更点>

  • doc 以下を修正
  • Windows 版でコンパイル時にワーニングが発生する部分にキャストを追加、変数の型を変更、ヘッダの追加等

※本アーカイブには実験的に x64 版の namazu.cgi.exe も含まれています。

Re: Windows Vista 問題改め msvcr8x, msvcr9x 問題2008年03月07日 22時35分29秒

msvcr[89]x 問題ですが、この CRT のソースは VC++ に付いています。 (エディションにもよりますが)

それで少しソース見てみると、VC8 の wild.c はこのようになっていました。 (VC9 も同等)

#ifdef WPRFLAG
        for (argv = __wargv; *argv; argv++) /* for each arg... */
#else  /* WPRFLAG */
        for (argv = __argv; *argv; argv++)  /* for each arg... */
#endif  /* WPRFLAG */
                {
            *(*argv)++; // the first character of the argument is dropped
            /*
               - native case: all the arguments that were not within quotes
               in the command line have their first character duplicated.
               - native/managed case: all the arguments that were within quotes
               in the command line "arrive" here without the ending quote.
               - managed case: all the arguments that were not within quotes
               in the command line "arrive" here with a starting quote.
               The algorithm was initially designed not to expand the arguments
               within quotes and this is the reason for the first added character
               (to check if an expansion is desired and to be removed after that).
               In future this character will not be added anymore, but until there
               will be decided so, it must still be removed.
            */

            // if wild required --> expand, else only add.
                if (wchar = _tcspbrk( *argv, WILDSTRING)) {
                if (tmatch( *argv, wchar )) return (-1);
                }
            else {
                if (tadd(*argv)) return (-1);
            }
        }

ちなみに VC7 では次の通りです。

#ifdef WPRFLAG
        for (argv = __wargv; *argv; argv++) /* for each arg... */
#else  /* WPRFLAG */
        for (argv = __argv; *argv; argv++)  /* for each arg... */
#endif  /* WPRFLAG */
            if ( *(*argv)++ == QUOTECHAR )
                /* strip leading quote from quoted arg */
            {
                if (tadd(*argv))
                    return(-1);
            }
            else if (wchar = _tcspbrk( *argv, WILDSTRING )) {
                /* attempt to expand arg with wildcard */
                if (tmatch( *argv, wchar ))
                    return(-1);
            }
            else if (tadd( *argv )) /* normal arg, just add */
                return(-1);

どうやら managed に対応するために処理がテキトウだったようです。(泣)

従来は引数の1文字目がダブルクォートの場合、ワイルドカードのマッチング処理を行わずダブルクォートの中身を引数にしてプログラムに渡していました。

VC[89]では、1文字目を無条件で捨てて、引数にワイルドカード文字"*?"が含まれる場合はマッチング処理を必ず行うようになっています。 マッチングで一致しない場合はそのまま引数にしてプログラムに渡しますが、マッチングが一致した場合はワイルドカードが展開されてプログラムに渡されてしまいます。

つまり、ワイルドカード文字が引数に含まれる場合は、ダブルクォートで囲もうと、ワイルドカード展開が起こるということです。 ダブルクォートは空白文字(スペースとタブ)を引数に含める場合にしか意味をなしません。

これは仕様変更というよりは、バグでしょう。

もちろんこれは setargv.obj をリンクし、引数のワイルドカード展開を行った場合の話です。 setargv.obj をリンクせず、引数のワイルドカード展開を行わない場合には関係のない話です。

namazu.exe もワイルドカード展開を行わなければ問題なく使えます。 その場合は、引数に指定するインデックスをワイルドカードで指定できなくなってしまいます。

ただ、インデックスの指定にワイルドカードが使えないということを引き換えにしてでも、古い VC++ 6.0 から VC++ 2005(VC8), VC++2008(VC9) に切り替える方が x64 対応等を考えると良い気もしてきました。