antenn-a
company profile

MFC航海日記 九日目(CStringの甘い罠)

先日書いた再起呼び出しのルーチンでは CStringを用いずに char* を用いたがメモリの確保・開放の手間を考えると char* を使うのは面倒くさい。今後MFCを使うに当たり、やはり CString はマスターしておきたい重要なクラスであると思う。そこで、CString を使って前に作った再起呼び出しによるファイル検索ルーチンをバージョンアップしようと思う。
まずは単純にchar* の部分をCString に変換してみる。当然うまく行くわけが無い。今まで当たり前のように使っていた標準関数が使えなくなるのだ。詳細はヘルプを見ていただきたい。
一番困ったのが2バイト系文字列の扱い方である。今まで2バイト系の文字列から特定の文字を検出する方法として「jstrchr」を用いていたが、なんとこの関数がVisual C++ のどこを見ても載っていないのである。困った・・・・どうしよう・・・・・私の師匠である「納富 一宏」大先生に尋ねたところ、似たような関数を発見!名前は「mbschr」というものだ!ちなみに今回行いたいルーチンは文字列の右側からの検索なので「mbsrchr」を用いる事にした。関数の形は下の通りである。

prev

int _mbsrchr( const unsigned char *string, unsigned int c );
第一引数がchar* なので八日目に行ったようにCString の書き込まれている領域を確保して渡すよう にする。しかし、普通に渡すとコンパイルがうまく行かない。それもそのはず引数は const unsigned char*なのでキャストしてやる事にする。すると・・・うまく行くではないか!(涙)
今回はCString の勉強をしようと思っていたのだが変なところで突っかかってしまった。
そのコードを下に示す。
#include  
void CFileEaterDlg::SearchFile
( CString path, CString filetype )
{
    WIN32_FIND_DATA    data;
    HANDLE             handle;
    CString            dir;

    if( ::SetCurrentDirectory( path ) == FALSE )
        return;
    //SearchFile
    if( ( handle = ::FindFirstFile( filetype, &data ) 
    ) != INVALID_HANDLE_VALUE ){
        do{
            if( data.dwFileAttributes != 
            FILE_ATTRIBUTE_DIRECTORY ){
                dir = path;
                if( dir.Right( 1 )  == '\\' )
                    dir += data.cFileName;
                else{
                    dir += "\\";
                    dir += data.cFileName;
                }
                SFDlg.FileList[ SFDlg.FileCount ] = dir;
                SFDlg.DeleteFlag[ SFDlg.FileCount ] = TRUE;
                DispSearchStatus( dir );
            }
            //
            PumpMessages();
        }while( FindNextFile( handle, &data ) );
    }
    //SearchDir
    if( ( handle = ::FindFirstFile( "*", &data ) )
     != INVALID_HANDLE_VALUE ){
        do{
            if( data.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &
            & strcmp( data.cFileName, "." )
            != 0 && strcmp( data.cFileName, ".." ) != 0 ){
                if( path.Right( 1 ) != '\\' )
                    path += "\\";
                path += data.cFileName;
                SearchFile( path, filetype );
                //中止ボタンが押されたら終了する
                if( StopFlag == TRUE )
                    return;

                //path cut
                LPTSTR  lptBuf = path.GetBuffer
                ( path.GetLength() );
                char* q = (char*)::_mbsrchr
                ( ( const unsigned char* )lptBuf, '\\' );
                if( q == NULL )
                    return;
                *q = '\0';

                path.ReleaseBuffer();
            }
        }while( FindNextFile( handle, &data ) );
    }
}

prev

今回も適当主義が爆発して何とか切り抜ける事ができた・・・・何処まで運が持つのやら・・・・(トホホ)


antenn-a

prev next


antenn-a