2012-02-13 5 views
0

私は新しいメンバーです。私はいくつかのプログラミング上の問題を抱えていました。私は大学のプロジェクトのためにメディアプレーヤー(Win32 SDK VC++ 6.0)をコーディングしようとしています。私は様々なフォーラムとmsdnを検索し、最終的にGetShortPathName関数に着いた。これは、名前に空白があるフォルダやファイルを再生できるようにする。ここにコードを貼り付けて、私がやろうとしていることについて、はるかに明確になるでしょう。開いているダイアログボックスを使ってファイルを受け入れた後にファイルを再生する

GetShortPathName関数を使用して
case IDM_FILE_OPEN : 
    ZeroMemory(&ofn, sizeof(ofn)); 
    ofn.lStructSize = sizeof(ofn); 
    ofn.hwndOwner = hwnd; 
    ofn.lpstrFilter = "Media Files (All Supported Types)\0*.avi;*.mpg;*.mpeg;*.asf;*.wmv;*.mp2;*.mp3\0" 
             "Movie File (*.avi;*.mpg;*.mpeg)\0*.avi;*.mpg;*.mpeg\0" 
             "Windows Media File (*.asf;*.wmv)\0*.asf;*.wmv\0" 
             "Audio File (*.mp2;*.mp3)\0*.mp2;*.mp3\0" 
             "All Files(*.*)\0*.*\0"; 
        ofn.lpstrFile = szFileName; 
        ofn.nMaxFile = MAX_PATH; 
        ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_CREATEPROMPT; 
        ofn.lpstrDefExt = "mp3"; 

        if(GetOpenFileName(&ofn)) 
        { 

         length = GetShortPathName(szFileName, NULL, 0); 
         buffer = (TCHAR *) malloc (sizeof(length)); 
         length = GetShortPathName(szFileName, buffer, length); 

         for(i = 0 ; i < MAX_PATH ; i++) 
         { 
          if(buffer[i] == '\\') 
           buffer[i] = '/'; 
         } 

         SendMessage(hList,LB_ADDSTRING,0,(LPARAM)buffer); 
         mciSendString("open buffer alias myFile", NULL, 0, NULL); 
         mciSendString("play buffer", NULL, 0, NULL); 
        } 

        return 0; 

として私はパスを取得:ファイルが開い/Mp3z/DEEPBL~1/03SLEE~1.mp3 は、再生ボタンの場合には直接

mciSendString("open D:/Mp3jh/DEEPBL~1/03SLEE~1.mp3 alias myFile", NULL, 0, NULL); 
mciSendString("play myFile", NULL, 0, NULL); 

をこのパスを置く:Dうまくいく。しかし、開いているファイルのダイアログボックスを開いて再生しようとすると、何も起こりません。すべての入力を高く評価しました。

+0

なぜ、短いパス名が必要だと思いますか? –

+1

短い名前は使用しないでください。ファイル名に引用符を追加するだけで、名前のスペースをエスケープすることができます: '' open \ "path/to/file /スペースin.mp3 \" alias myFile " –

答えて

0

問題ではなく、バッファの内容を渡すよりも、あなたが文字列としてmciSendString関数にbuffer変数の名前を渡しているということであるように見えます。

あなたは内容bufferで(openalias myFile)を渡したい引数を連結する必要があります。

mallocを自動配列に置き換えることでコードを大幅に簡略化することもできます。 mallocは必要ありません。なぜなら、あなたはブロックスコープの外にそれを必要としないからです。 (そして、あなたはとにかくC++コードでmallocを使用すべきではありません。代わりにnew[]を使用しています。)

ここでは、あなたの質問に示すコードの修正抜粋です:
(警告:変更はコンパイラとしてだけ私の目を使用しては、 !注意して取り扱ってください。)

if(GetOpenFileName(&ofn)) 
{ 
    // Get the short path name, and place it in the buffer array. 
    // We know that a short path won't be any longer than MAX_PATH, so we can 
    // simply allocate a statically-sized array without futzing with new[]. 
    // 
    // Note: In production code, you should probably check the return value 
    // of the GetShortPathName function to make sure it succeeded. 
    TCHAR buffer[MAX_PATH]; 
    GetShortPathName(szFileName, buffer, MAX_PATH); 

    // Add the short path name to your ListBox control. 
    // 
    // Note: In C++ code, you should probably use C++-style casts like 
    // reinterpret_cast, rather than C-style casts! 
    SendMessage(hList, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(buffer)); 

    // Build the argument string to pass to the mciSendString function. 
    // 
    // Note: In production code, you probably want to use the more secure 
    // alternatives to the string concatenation functions. 
    // See the documentation for more details. 
    // And, as before, you should probably check return values for error codes. 
    TCHAR arguments[MAX_PATH * 2]; // this will definitely be large enough 
    lstrcat(arguments, TEXT("open")); 
    lstrcat(arguments, buffer); 
    lstrcat(arguments, TEXT("alias myFile")); 
    // Or, better yet, use a string formatting function, like StringCbPrintf: 
    // StringCbPrintf(arguments, MAX_PATH * 2, TEXT("open %s alias myFile"), 
    //    buffer); 

    // Call the mciSendString function with the argument string we just built. 
    mciSendString(arguments, NULL, 0, NULL); 
    mciSendString("play myFile", NULL, 0, NULL); 
} 

ことに注意してください、上記のコードが示すように、Cスタイルの文字列(文字配列)での作業はお尻の本当の痛みです。 C++は、std::stringクラスの形式で、より良い代替を提供します。代わりにそれを使用することを強く検討する必要があります。 Windows API関数を呼び出すには、Cスタイルの文字列が必要ですが、std::stringクラスのc_strメソッドを使用すると、そのいずれかを取得できます。

+0

ありがとうございます。私はstrcpyとstrcatを使っていました。ありがとうコーディーグレイコードです。それは私がしたことに似ています。 – Salil

関連する問題