◀ANSI版開発トップへ
  • 4097 を開くと落ちる >sakura.exe
    とするだけで落ちます。
    ▼CCommandLine.cpp(221)
    > int len = lstrlen( pszToken + 1 );
    > cmWork.SetData( &pszToken[1], len - ( pszToken[len] == '"' ? 1 : 0 ));
    で結局、cmWork.SetData( p, -1 )になってるんではないかと。
    • 4098 RE: "を開くと落ちる
      • 4101 Re2: "を開くと落ちる
      • 4102 Re2: "を開くと落ちる
      • 4104 Re2: "を開くと落ちる
        • 4105 Re3: "を開くと落ちる
        • 4109 Re3: "を開くと落ちる
          • 4112 Re4: "を開くと落ちる
            • 4118 Re5: "を開くと落ちる
              • 4176 Re6: "を開くと落ちる
                • 4204 Re7: "を開くと落ちる
            • 4120 Re5: "を開くと落ちる
              • 4121 Re6: "を開くと落ちる
  • [4097] を開くと落ちる >sakura.exe
    とするだけで落ちます。
    ▼CCommandLine.cpp(221)
    > int len = lstrlen( pszToken + 1 );
    > cmWork.SetData( &pszToken[1], len - ( pszToken[len] == '"' ? 1 : 0 ));
    で結局、cmWork.SetData( p, -1 )になってるんではないかと。
    もか 2005年11月08日 23:56

    • [4098] RE: "を開くと落ちる げんた 2005年11月09日 00:26

      >>sakura.exe "
      >とするだけで落ちます。
      >▼CCommandLine.cpp(221)
      >> int len = lstrlen( pszToken + 1 );
      >> cmWork.SetData( &pszToken[1], len - ( pszToken[len] == '"' ? 1 : 0 ));
      >で結局、cmWork.SetData( p, -1 )になってるんではないかと。
      言われてみればたしかに.1つの引用符が,最初と最後の2つと見間違えられてしまうのですね.
      早急に直します.
      • [4101] Re2: "を開くと落ちる すす 2005年11月10日 11:28

        ▼ げんたさん
        > >>sakura.exe "
        > >とするだけで落ちます。
        > >▼CCommandLine.cpp(221)
        > >> int len = lstrlen( pszToken + 1 );
        > >> cmWork.SetData( &pszToken[1], len - ( pszToken[len] == '"' ? 1 : 0 ));
        > >で結局、cmWork.SetData( p, -1 )になってるんではないかと。
        > 言われてみればたしかに.1つの引用符が,最初と最後の2つと見間違えられてしまうのですね.
        > 早急に直します.
        その部分のソースのコメントを読んで、ちょっと意地悪なんですが
        sakura.exe """
        として「名前を変えて保存」を行うと
        「ダイアログが開けません。エラー:FNERR_INVALIDFILENAME」となり、保存できません。

        すでに存在するファイルを開き「名前を変えて保存」で先頭に\をつけるとドライブのルートに保存されます。
         ->これは仕様でもいい気がしますが。

      • [4102] Re2: "を開くと落ちる すす 2005年11月10日 16:06

        ▼ げんたさん
        > >>sakura.exe "
        > >とするだけで落ちます。
        > >▼CCommandLine.cpp(221)
        > >> int len = lstrlen( pszToken + 1 );
        if (len==0) {
        break;
        }
        だけで起動時に落ちなくなりました。

        > >> cmWork.SetData( &pszToken[1], len - ( pszToken[len] == '"' ? 1 : 0 ));
        > >で結局、cmWork.SetData( p, -1 )になってるんではないかと。
        > 言われてみればたしかに.1つの引用符が,最初と最後の2つと見間違えられてしまうのですね.
        > 早急に直します.

        ちょっと詳しく動作をチェックしたら
        ? * を含むファイル名
        サクラエディタ起動 ○
        上書き保存 X パスが存在しないか...
        ファイル名を変更して保存-ダイアログ表示 ○
                    -そのまま保存  X なにもエラーが出ない
                    -ファイル名を変更して保存 ○


        / を含むファイル名
        サクラエディタ起動 ○
        上書き保存 X パスが存在しないか...
        ファイル名を変更して保存-ダイアログ表示 ○
                    -そのまま保存  X パスが存在しないか...
                    -ファイル名を変更して保存 ○

        < を含むファイル名
        サクラエディタ起動 ○
        上書き保存 X パスが存在しないか...
        ファイル名を変更して保存-ダイアログ表示 X

        > を含むファイル名
        サクラエディタ起動 ○
        上書き保存 X パスが存在しないか...
        ファイル名を変更して保存-ダイアログ表示 ○
                    -そのまま保存  X 上記のファイル名は無効です。
                    -ファイル名を変更して保存 ○

        : を含むファイル名
        サクラエディタ起動 ○
        上書き保存 X 保存するが:以降削られたファイル名に勝手に変わる
        ファイル名を変更して保存-ダイアログ表示 X


        "が3文字以上連続
        サクラエディタ起動 ○
        上書き保存 X パスが存在しないか...
        ファイル名を変更して保存-ダイアログ表示 X

        こんな感じでした。
      • [4104] Re2: "を開くと落ちる すす 2005年11月11日 15:45

        ▼ げんたさん

        「ダイアログが開けません。エラー:FNERR_INVALIDFILENAME」はちょっと気になるので
        とりあえず直してみました。
        簡単なチェックだけですが、すみません。
        このチェックだとURL指定されたときだめですね。
        ':'チェックどうしようかしら。

        --- sakura_org\CCommandLine.cpp Thu Nov 3 20:53:18 2005
        +++ sakura_core\CCommandLine.cpp Fri Nov 11 15:38:23 2005
        @@ -219,12 +219,41 @@
        // ファイル名には使えない文字なのでファイル名に含まれている場合は考慮不要
        // またSHIFT-JISの2バイト目の考慮も不要
        int len = lstrlen( pszToken + 1 );
        +
        + // Nov. 11, 2005 susu
        + // "のみの場合落ちるので修正
        + if ( len == 0 ) {
        + break;
        + }
        +
        cmWork.SetData( &pszToken[1], len - ( pszToken[len] == '"' ? 1 : 0 ));
        cmWork.Replace( "\"\"", "\"" );
        strcpy( m_fi.m_szPath, cmWork.GetPtr() ); /* ファイル名 */
        }else{
        strcpy( m_fi.m_szPath, pszToken ); /* ファイル名 */
        }
        +
        + // Nov. 11, 2005 susu
        + // 不正なファイル名のままだとファイル保存時ダイアログが出なくなるので
        + // 簡単なファイルチェックを行うように修正
        + char msg_str[_MAX_PATH + 1];
        + sprintf( msg_str, " %s \r\n上記のファイル名は不正です。ファイル名に \ / : * ? \" < > | の文字は使えません。 ", m_fi.m_szPath );
        + for (int i = 0; i < strlen(m_fi.m_szPath); i ++) {
        + if ( (m_fi.m_szPath[i] == '<' || // 0x3C
        + m_fi.m_szPath[i] == '>' || // 0x3E
        + m_fi.m_szPath[i] == '?' || // 0x3F
        + m_fi.m_szPath[i] == '"' || // 0x22
        + m_fi.m_szPath[i] == '|' || // 0x7C
        + m_fi.m_szPath[i] == '*' || // 0x2A
        + ( m_fi.m_szPath[i] == ':' && i != 1) // 0x3A
        + ) &&
        + ( i > 0 && ! _IS_SJIS_1( (unsigned char)(m_fi.m_szPath[i - 1] )) )){
        + MessageBox( NULL, msg_str, "FileNameError", MB_OK);
        + strcpy( m_fi.m_szPath, "" );
        + break;
        + }
        + }
        +
        }else{
        ++pszToken; // 先頭の'-'はskip
        char *arg;
        • [4105] Re3: "を開くと落ちる すす 2005年11月11日 15:52

          ▼ すすさん
          > ▼ げんたさん
          >
          > 「ダイアログが開けません。エラー:FNERR_INVALIDFILENAME」はちょっと気になるので
          > とりあえず直してみました。
          > 簡単なチェックだけですが、すみません。
          > このチェックだとURL指定されたときだめですね。
          > ':'チェックどうしようかしら。
          >
          + char msg_str[_MAX_PATH + 1];
          + sprintf(

          この2行は
          + MessageBox
          の直前の方がいいですね。
        • [4109] Re3: "を開くと落ちる すす 2005年11月11日 17:37

          URI指定に対応 って大丈夫かな?

          --- sakura_org\CCommandLine.cpp Thu Nov 3 20:53:18 2005
          +++ sakura_core\CCommandLine.cpp Fri Nov 11 17:35:14 2005
          @@ -219,12 +219,46 @@
          // ファイル名には使えない文字なのでファイル名に含まれている場合は考慮不要
          // またSHIFT-JISの2バイト目の考慮も不要
          int len = lstrlen( pszToken + 1 );
          +
          + // Nov. 11, 2005 susu
          + // "のみの場合落ちるので修正
          + if ( len == 0 ) {
          + break;
          + }
          +
          cmWork.SetData( &pszToken[1], len - ( pszToken[len] == '"' ? 1 : 0 ));
          cmWork.Replace( "\"\"", "\"" );
          strcpy( m_fi.m_szPath, cmWork.GetPtr() ); /* ファイル名 */
          }else{
          strcpy( m_fi.m_szPath, pszToken ); /* ファイル名 */
          }
          +
          + // Nov. 11, 2005 susu
          + // 不正なファイル名のままだとファイル保存時ダイアログが出なくなるので
          + // 簡単なファイルチェックを行うように修正
          + if (!memcmp(m_fi.m_szPath, "file:///", 8)) {
          + char tmp_str[_MAX_PATH + 1];
          + strcpy(tmp_str, &(m_fi.m_szPath[8]));
          + strcpy(m_fi.m_szPath, tmp_str);
          + }
          + for (int i = 0; i < strlen(m_fi.m_szPath); i ++) {
          + if ( (m_fi.m_szPath[i] == '<' || // 0x3C
          + m_fi.m_szPath[i] == '>' || // 0x3E
          + m_fi.m_szPath[i] == '?' || // 0x3F
          + m_fi.m_szPath[i] == '"' || // 0x22
          + m_fi.m_szPath[i] == '|' || // 0x7C
          + m_fi.m_szPath[i] == '*' || // 0x2A
          + ( m_fi.m_szPath[i] == ':' && i != 1) // 0x3A
          + ) &&
          + ( i > 0 && ! _IS_SJIS_1( (unsigned char)(m_fi.m_szPath[i - 1] )) )){
          + char msg_str[_MAX_PATH + 1];
          + sprintf( msg_str, "%s\r\n上記のファイル名は不正です。ファイル名に \\ / : * ? \" < > | の文字は使えません。 ", m_fi.m_szPath );
          + MessageBox( NULL, msg_str, "FileNameError", MB_OK);
          + strcpy( m_fi.m_szPath, "" );
          + break;
          + }
          + }
          +
          }else{
          ++pszToken; // 先頭の'-'はskip
          char *arg;

          • [4112] Re4: "を開くと落ちる もか 2005年11月11日 22:55

            すすさんの「<>?"|*」のチェックは必要ですね。
            >':'チェックどうしようかしら。
            ディレクトリ名として登場する場合は確かに不正ですが、
            過去に何回か登場しているNTFSの場合のサブストリームなら正常です。
            >>3512
            この機能、よくわからないのは、
            (試さないほうがいいです。自己責任でお願いします)
            >notepad.exe :sub
            >notepad.exe .\:sub
            などで、正常に読み書きできるのですが、ファイル名が無いのです。。。
            この場合どうなってるんでしょうね。
            どうやって削除したらいいのか私にはわかりませんでした。

            >「ダイアログが開けません。エラー:FNERR_INVALIDFILENAME」となり、保存できません。
            マクロやD&Dからファイル名がサクラエディタに設定されることも考慮すると、
            CDlgOpenFileで対処するほうが良いと思います。
            FNERR_INVALIDFILENAMEだった場合は、ファイル名を空にしてダイアログを開きなおしてくれるとうれしいです。
            • [4118] Re5: "を開くと落ちる すす 2005年11月12日 03:15

              ▼ もかさん
              > すすさんの「<>?"|*」のチェックは必要ですね。
              > >':'チェックどうしようかしら。
              > ディレクトリ名として登場する場合は確かに不正ですが、
              > 過去に何回か登場しているNTFSの場合のサブストリームなら正常です。
              > >>3512
              > この機能、よくわからないのは、
              > (試さないほうがいいです。自己責任でお願いします)
              > >notepad.exe :sub
              > >notepad.exe .\:sub
              > などで、正常に読み書きできるのですが、ファイル名が無いのです。。。
              > この場合どうなってるんでしょうね。
              > どうやって削除したらいいのか私にはわかりませんでした。
              >
              > >「ダイアログが開けません。エラー:FNERR_INVALIDFILENAME」となり、保存できません。
              > マクロやD&Dからファイル名がサクラエディタに設定されることも考慮すると、
              > CDlgOpenFileで対処するほうが良いと思います。
              > FNERR_INVALIDFILENAMEだった場合は、ファイル名を空にしてダイアログを開きなおしてくれるとうれしいです。
              D&Dの場合はすでに存在するファイルだから問題ないのでは?
              マクロでオープンは。。。考えてもいませんでした。

              きっと「げんたさん」が何とかしてくれる。。。
              • [4176] Re6: "を開くと落ちる げんた 2005年11月27日 15:12

                >きっと「げんたさん」が何とかしてくれる。。。
                何にもしないでとりあえずそのまま突っ込もうかと思ったんですが...

                """でファイル名が"になる件が解決されていませんね.

                &&( i > 0 && ! _IS_SJIS_1( (unsigned char)(m_fi.m_szPath[i - 1] ))
                というのが間違っているようです.

                i>0を命題A, _IS_SJIS_1...を命題Bとしたとき
                ここは (A&&B) ではなくて (A⇒B)が入らないとi==0,すなわち先頭に不正な文字が来た場合を見逃します.

                A⇒Bを展開すると(!A||A&&B)ですかね.
                • [4204] Re7: "を開くと落ちる すす 2005年12月05日 12:14

                  ▼ げんたさん
                  > >きっと「げんたさん」が何とかしてくれる。。。
                  > 何にもしないでとりあえずそのまま突っ込もうかと思ったんですが...
                  >
                  > """でファイル名が"になる件が解決されていませんね.
                  自分で指摘したのに思いっきり、ミスってますね。
                  ご指摘&修正ありがとうございました。
            • [4120] Re5: "を開くと落ちる すす 2005年11月12日 03:24

              ちょっと書き忘れてました。

              ▼ もかさん
              > すすさんの「<>?"|*」のチェックは必要ですね。
              > >':'チェックどうしようかしら。
              > ディレクトリ名として登場する場合は確かに不正ですが、
              > 過去に何回か登場しているNTFSの場合のサブストリームなら正常です。
              NTFSの場合のサブストリームですか。知らなかった。
              + ( m_fi.m_szPath[i] == ':' && i != 1) // 0x3A
              は削除ってことで

              > >>3512
              > この機能、よくわからないのは、
              > (試さないほうがいいです。自己責任でお願いします)
              > >notepad.exe :sub
              > >notepad.exe .\:sub
              > などで、正常に読み書きできるのですが、ファイル名が無いのです。。。
              > この場合どうなってるんでしょうね。
              > どうやって削除したらいいのか私にはわかりませんでした。
              もしかしてディレクトリとか?
              • [4121] Re6: "を開くと落ちる すす 2005年11月12日 03:42

                ▼ もかさん
                > > >>3512
                > > この機能、よくわからないのは、
                > > (試さないほうがいいです。自己責任でお願いします)
                > > >notepad.exe :sub
                > > >notepad.exe .\:sub
                > > などで、正常に読み書きできるのですが、ファイル名が無いのです。。。
                > > この場合どうなってるんでしょうね。
                > > どうやって削除したらいいのか私にはわかりませんでした。
                > もしかしてディレクトリとか?
                ってことで試してみました。
                メインストリームを削除するとサブストリームは削除
                されるらしいので

                c:\temp\tmp\ を作成
                notepad.exe c:\temp\tmp:sub なんか書いて保存
                notepad.exe c:\temp\tmp:sub 書かれていることを確認
                c:\temp\tmp を削除
                notepad.exe c:\temp\tmp:sub 見つからないんで作成するか?ダイアログが出ました。

                やっぱりカレントディレクトリのサブストリームに書き込まれているようです。
                サブストリームだけ削除ってできないのかなぁ?