Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> 基本 >> ANSIコンパイルのときは、パスのバックスラッシュ(”¥”)に気をつけて

ANSIコンパイルのときは、パスのバックスラッシュ("\")に気をつけて

  ANSIでコンパイルしている際は、"表"などの2バイト文字はバックスラッシュとして誤判定しないように気をつけて組む必要があります。
  基本ですが、注意しなければならない重要な問題です。

  IsDBCSLeadByte () APIを使用し、指定された文字が先行バイトかどうか調べましょう。

  以下は、「C:\Users」(Vista)「C:\Documents and Settings」(2000/XP)フォルダを取得する例です。

■ 「C:\Users」(Vista)「C:\Documents and Settings」(2000/XP)フォルダを取得する
// ...省略...

    enum
    {
        MY_MAX_PATH = 2048
    };
// パス作成
    // 自分のフォルダを取得 ( C:\\Documents and Settings\\<user name> )
    char szPath[ MY_MAX_PATH ];
    if ( !SHGetSpecialFolderPath ( NULL, szPath, CSIDL_PROFILE, TRUE ) )
    {
        return FALSE;
    }

    // ユーザー名を削除し、Documents and Settingsパスを取得する
    // (ユーザー名に"表"などの文字があってもご認識しないように)
    char *pszPtr = szPath;
    char *pKept = pszPtr;

    while ( *pszPtr != '\0' )
    {
        // 2バイト文字の先頭はスキップ
        if ( 0 == IsDBCSLeadByte ( *pszPtr ) )
        {
            //"\\" "/" がある場合、現在地 +1 のポインタを保存
            if( (*pszPtr == '\\') || (*pszPtr == '/'))
            {
                pKept = pszPtr + 1;
            }
        }
        //次の文字へ
        pszPtr = CharNext ( pszPtr );
    }

    char szRetPath[ MY_MAX_PATH ];
    lstrcpyn ( szRetPath, szPath, lstrlen ( szPath ) - lstrlen ( pKept ) );

    MessageBox ( NULL,
        szRetPath,
        "確認",
        MB_OK );

// ...省略...
  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita