0

.wavファイルを再生するオーディオプレーヤーを作成しようとしています。ファイルのwaveデータをWAVEHDR構造体に読み込むための関数ReadWaveFile(CString szFilename)を作成しました。この関数では

BOOL CWavePlay::ReadWaveFile(CString szFilename)
{
    hmmio = mmioOpen((LPTSTR)&szFilename,NULL,MMIO_READ);
    ASSERT(hmmio);      //error here: hmmio=0x00000000
    if(hmmio==0)
        return FALSE;
        ....
}

指定されたファイルを開くためにこの関数にファイルパスを渡すと、mmioOpenは常に0を返します。そして、mmioOpen APIでファイルパスを明示的に渡すと、コードが機能するのが困惑します。つまり、有効なハンドルが返されます。なぜこれが起こっているのか、誰かが説明できますか?

4

1 に答える 1

0

と言ったらどうなるか

MessageBox(NULL,(LPTSTR)&szFilename,"Foo",MB_ICONINFORMATION);

文字列をシステム関数に渡すときは、生の文字列へのポインターを取得する必要があります。たとえば、std::string オブジェクトを使用してパスを作成する場合は、次のように言う必要があります。

mmioOpen(filename.c_str(),NULL,MMIO_READ);

CString* から LPTSTR へのキャストは、CString が LPTSRT とバイナリ互換であると想定していますが、そうではありません。szFilename に LPCTSTR を記述すると、適切な形式に変換する CStrings で定義されたキャスト演算子が呼び出されます。試してみましたか

hmmio = mmioOpen((LPCTSTR)szFilename,NULL,MMIO_READ);

最後のキャストはここでは実際には何もしないので、それで十分です。

于 2012-03-29T08:10:04.130 に答える