none
Windows10 1803 と _spawnlp() 関数

    質問

  • Windows10をバージョン 1803 にアップグレードしたところ、自作のアプリケーションが動かなくなりました。同じアプリをWindows7で実行すると問題なく動きます。win32アプリからコンソールアプリを:

    ret = _spawnlp ( _P_WAIT, EXEC_FILE_NAME, EXEC_FILE_NAME, Arg1, Arg2, Arg3, NULL );

    で起動すると、コンソールウインドウが表示され、直後にArg1/Arg2/Arg3の内容を表示します。

    ●引数に日本語(ShiftJIS)が含まれると、コンソールには文字化けした引数が表示されます。

    ●引数に日本語(ShiftJIS)が含まれると、コンソールアプリは失敗します(例えばファイルのオープンに失敗する)。

    ●CMDウインドウに於いて、コンソールアプリを直接起動する(引数にも日本語を含ませて)と、処理に成功します。起動直後の引数表示も文字化けすることはありません。

    ●尚、win32アプリ、コンソールアプリとも"マルチバイト文字"環境で作成しております。

    どのようにすれば問題を解消できるでしょうか、_spawnlp()に渡す文字列をユニコード等に変換すればよいでしょうか、ただし私が調べた限りでは「そうすることが必要だ」と書いた記述などは見つかりませんでした。


    2018年5月18日 8:36

すべての返信

  • 参考までに両環境のコマンドプロンプト上で chcp コマンドを実行し、結果を教えてください。どちらも 932 が返されることを期待しています。
    2018年5月18日 9:05
  • 回答ありがとうございます。仰るとおりWindows10/Windows7両方のコマンドプロンプト上で"chcp"を実行すると:

    『現在のコード ページ: 932』

    と表示されます。

    2018年5月18日 9:18
  • _spawnlp()の使用を取りやめ、以下のようなCreateProcess()に変更すると、あっさりとうまく行きました。

             STARTUPINFO si;
             PROCESS_INFORMATION pi;
             GetStartupInfo(&si);
             CreateProcess ( NULL, Arg.PopData (), NULL, NULL, FALSE,
                CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi );

             CloseHandle(pi.hThread);
             WaitForSingleObject(pi.hProcess,INFINITE);
             CloseHandle(pi.hProcess);

    ワケが解りません。

    2018年5月21日 1:49