◀ANSI版開発トップへ
  • 458 6/25付
    • 461 Re:6/25付
      • 462 外部コマンド実行
      • 661 Re:外部コマンド実行
        • 669 どのソースを見てますか? Re2: 外部コマンド実行
          • 673 Re:どのソースを見てますか? Re2: 外部コマンド実行
    • 463 Re:6/25付
    • 465 Re:6/25付
    • 467 Re:VBのアウトライン解析
  • [458] 6/25付 げんた 2001年06月25日 21:51

    昨日までのpatchをまとめました。6/22からの差分と、nakataniさん用5/28付けからの差分の2種類を作ってあります。

    ソース一式からはJre32関連の3ファイルとresourceディレクトリ以下のファイル(bitmap/cursor/icon)を取り除いてありますので、このままではコンパイルできません。

    肝心の動作なんですが、nakataniさんの直してくれた外部コマンド実行が不調です。ウィンドウがたくさん開くのとアウトプットウィンドウに書き込めないのは直ったのですが、標準出力の取り込みが相変わらず動作しないようです(Win2K)。コマンド列だけが取り込まれます。

    またcommand.comの実行時に16ビットサブシステムより「NTVDMはシステムエラーを検出しました。ハンドルが無効です」というエラーが出ます。
    • [461] Re:6/25付 nakatani 2001年06月26日 00:04

      ▼ げんたさん
      > 昨日までのpatchをまとめました。6/22からの差分と、nakataniさん用5/28付けからの差分の2種類を作ってあります。
      >
      > ソース一式からはJre32関連の3ファイルとresourceディレクトリ以下のファイル(bitmap/cursor/icon)を取り除いてありますので、このままではコンパイルできません。
      >
      > 肝心の動作なんですが、nakataniさんの直してくれた外部コマンド実行が不調です。ウィンドウがたくさん開くのとアウトプットウィンドウに書き込めないのは直ったのですが、標準出力の取り込みが相変わらず動作しないようです(Win2K)。コマンド列だけが取り込まれます。
      >
      > またcommand.comの実行時に16ビットサブシステムより「NTVDMはシステムエラーを検出しました。ハンドルが無効です」というエラーが出ます。

      やっぱりダメみたいですね
      私はWindows98でしか動作確認してませんでした
      CreateProcessするときにファイルハンドルを子プロセスに渡してるのでたぶん
      SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバとかに
      きちんとなんか設定しとかんとダメなんでしょうかね
      windows95(たぶん98もそうだと思うけど)ではそういうのが
      無視されるとAPIリファレンスに書かれてますね

      そういう問題じゃないんかな・・
      • [462] 外部コマンド実行 げんた 2001年06月26日 00:54

        eGroupsに双六さんが作ってくれたPipeCommandクラスがあるので、これをうまく活用できないでしょうか。外部コマンドとスレッドのハンドリングを行ってくれるので、あとはオブジェクトの生成、消失と標準入出力のハンドリング(これは別スレッドで動くので考慮が必要)を作ればいいだけなんですが。
      • [661] Re:外部コマンド実行 ああああ 2001年08月31日 10:58

        ソースコードをいろいろチェックしてみました。

        CEditView.cpp の8072 行目:
        > hFile = ::CreateFile( szTempFile,
        > GENERIC_WRITE | GENERIC_READ,
        > FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,
        > CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );

        8091行目:
        > StartupInfo.hStdOutput = hFile;
        > StartupInfo.hStdError = hFile;
        これでは、同一ハンドルのとき、閉じられるときデータが失われる可能性があると思います。
        DuplicateHandle を使って、ハンドルの継承を何とかするとか。

        > またcommand.comの実行時に16ビットサブシステムより「NTVDMはシステムエラーを検出しました。ハンドルが無効です」というエラーが出ます。

        調べてみると、dir は標準エラー出力を使うみたいです。次のMS-DOSコマンドで確認できます。

        C:\>dir >& test.txt

        C:\>type test.txt
        ドライブ C: のボリュームラベルはありません.
        ボリュームシリアル番号は 0623-0AF5
        ディレクトリは C:\

        53,575,680 バイトの空きがあります.

        他にも気になる点がいくつかあります。リファレンスによると:

        >lpSecurityAttributes
        > If you want the console to be inherited,
        > the bInheritHandle member of the
        > SECURITY_ATTRIBUTES structure must be TRUE.
        >
        >dwCreationDistribution
        > The user should specify OPEN_EXISTING when
        > using CreateFile to open the console.

        >The CreateProcess function's
        >fInheritHandles parameter must
        >be set to TRUE for this to work properly.

        とあります。コードを書くときにはよくリファレンスやコード例を参照した方がよろしいですよ。

        > SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor
        > メンバとかにきちんとなんか設定しとかんとダメなんで
        > しょうかね

        SECURITY_ATTRIBUTES の lpSecurityDescriptor 以外のメンバは Win95/98 でも参照されるはずです。おそらくリファレンスの間違いです。

        同じく 8108 行目。Windows 2000 では、3 つの DOS 窓が開きました。おそらくこの行の辺りから起こっています。

        バージョンと ProcessInfo.hProcess をチェックすることをお勧めします。<stdlib.h> の _osver, _win{ver,major,minor} を使えば素早くバージョンをチェックできます。

        <stdlib.h> から:
        >#define _osver (*__p__osver())
        >#define _winver (*__p__winver())
        >#define _winmajor (*__p__winmajor())
        >#define _winminor (*__p__winminor())

        これで WinNT/2000 で command.com を実行することは避けられます。

        Windows 版の Mule のソースコードと、MSDN のコードサンプル:
        [Platform SDK]-[Reference]-[Code Samples]-{
         [WINBASE]-{
          [IO]-[ASYNCIO],
          [IPC]-[INHERIT]
         },
         [WINUI]-[CONGUI]
        }
        には非同期入出力の例などがあって役に立つと思います。
        • [669] どのソースを見てますか? Re2: 外部コマンド実行 げんた 2001年08月31日 14:23

          >8091行目:
          >> StartupInfo.hStdOutput = hFile;
          >> StartupInfo.hStdError = hFile;
          これはnakataniさんが書いたやつではないですか?
          この部分はGAEさんが書き直しているので,指摘されたコードは使われていません.
          (でも,同じことやってるようですが)

          どうせなら新しい版(共有フォルダにあります)を見ていただいた方がよろしいかと思います.
          • [673] Re:どのソースを見てますか? Re2: 外部コマンド実行 ああああ 2001年09月11日 11:39

            ▼ げんたさん
            > どうせなら新しい版(共有フォルダにあります)を見ていただいた方がよろしいかと思います.

            どうも。見ました。参加します。
    • [463] Re:6/25付 げんた 2001年06月26日 00:57

      もう1点直したところ。

      新しいエディタ画面を開くところ(CEditApp::OpenNewEditor)でnakataniさんはウィンドウが確実に開くのを待つためのウェイトループを入れていましたが、OpenNewEditorを以前改修したときに追加したsyncパラメータ(ウィンドウが開かれるまで待つ)を利用するようにしました。
    • [465] Re:6/25付 じぇぷろ 2001年06月26日 01:44

      ▼ げんたさん
      > ソース一式からはJre32関連の3ファイルとresourceディレクトリ以下のファイル(bitmap/cursor/icon)を取り除いてありますので、このままではコンパイルできません。
      やけのやんぱち?(^_^;) リソース全部を消すことはないと思うけど。。。まあ、いいです。それとJre32のうちのJREUSR.HはHPからDLできるファイルと実質同じです。(記事327で既に述べた)
      だからコンパイルにホントに必要なのは2ファイルだけです。unofficialrelease.txtその他少し修正しました。おかしかったら再修正して下さい。なおテキストファイル自身の著作権がまだ明記されてません。明日にでも置いときます。
    • [467] Re:VBのアウトライン解析 すとーにぃ 2001年06月26日 21:47

      6/25のソースをコンパイルしてみました。
      VBのアウトライン解析がついて、感動です。
      これで、プロパティプロシージャを認識してくれると、更にうれしいのですが。

      | Public Property Get foo() As XXX
      | Public Property Let foo (hogehoge As XXX)