スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

文字列の変換がややこしいと思った(LPWSTR、CHAR*など)

えーと現在DirectSound8を用いたサウンド再生を行っているのですが、
その際、mmio関数群を用いてWAVEファイルを読み込んでいます。


そしたら、読み込みの際LPWSTRの引数の部分でエラーが出ました。
(一部 変数の宣言部分などを省略してます。)
// Waveファイルオープン関数
bool CSoundFactory::OpenWave( std::string t_FileName) {
// Waveファイルオープン
memset( &mmioInfo, 0, sizeof(MMIOINFO) );
hMmio = mmioOpen( t_FileName, &mmioInfo, MMIO_READ );
return(TRUE);
}


【表示エラー】
1 番目の引数を 'std::string' から 'LPWSTR' に変換できません。


「あぁ、型変換がうまく行っていないんだな。」と思い、
書き直してみたコードがこれ。
// Waveファイルオープン関数
bool CSoundFactory::OpenWave( std::string t_FileName) {
// Waveファイルオープン
char t[100] = {'\0'};
 for(int i = 0, count = t_FileName.size(); i < count; i++)
{
t[i] = t_FileName[i];
}
//LPWSTRへ変換!
LPWSTR tt = (LPWSTR)t;

memset( &mmioInfo, 0, sizeof(MMIOINFO) );
hMmio = mmioOpen( tt, &mmioInfo, MMIO_READ );
return(TRUE);
}


上記の様にすると、コンパイルエラーは発生しなくなりました。
しかし、waveファイルの読み込みに失敗するようになりました。

なぜ・・・!?
と思い、上記のttという変数をしらべてみると、

"轆轤荼薇饂飩"という様に、
意味の分からない文字化けした文字列が格納されてました。

どうも、キャスト(char → LPWSTR)した際に文字化けが発生するようです。
この野郎・・・!!


で、色々と調べてみたところ、
以下の様にしたら、あっさりと読み込みまで成功してしまいました。

bool CSoundFactory::OpenWave( std::string t_FileName) {
// Waveファイルオープン
size_t origsize = t_FileName.size() + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
wchar_t wcstring[newsize];
mbstowcs_s(&convertedChars, wcstring, origsize, t_FileName.c_str(), _TRUNCATE);

memset( &mmioInfo, 0, sizeof(MMIOINFO) );
hMmio = mmioOpen( wcstring, &mmioInfo, MMIO_READ );
return(TRUE);
}

※変数の宣言、エラー処理もろもろ省略してます。

よく分からんが、
mbstowcs_s関数を使えばOKのようです。
こんな関数 聞いたことない・・・!

TCHARとか、LPCTSTRとか、LPTSTRとか 全然なじみが無いし、
変換する関数も 全然知らないものばかりで、

文字列の変換はややこしいなと思いました。
何で こんな状態になってるんだか。

とりあえず、引き続きDirectSound8の実装を続けます!

※今回 参考にしたサイト。↓
【参考URL】さまざまな文字列型間で変換する
スポンサーサイト

テーマ : 日記 - ジャンル : 日記

コメント

No title

DirectSoundよりも後継のXAudio2かXACT3の方がゲームに適しているかもしれません。

No title

なんと・・・(´・ω・`)
アドバイスありがとうございますv-411

調べてみたら、
XAudio2などではCPUに負担がかからないとか
そんな事が記載してあるのを確認しました。
(まだ完全に把握していないですが)

それを考えると、
DirectSoundを使用するよりも良いのかな?と思いました。

DirectSoundの実装が終わったら、
(とりあえず完成させたい)

XAudio2などの実装もちょっとやってみたいと思います!v-290

No title

 そんなに複雑にしなくても、1つ目のコードで、mmioOpenではなく mmioOpenAにし、第一引数の t_FileNameを t_FileName.c_str()にすれば良かったりしないでしょうか。
 或いは 引数を TCHARの型によって変化する std::tstringとかを作ってそれを引数にすればmmioOpenのままでいいですね。

No title

あぁー(´・ω・`)
内部で切り替えて呼ばれる関数を
直接呼び出せば良かった
んですねOTZ

上記の方法で正常に実行できました!
ありがとうございます!v-411

ここら辺の事は、
(自分の買った)参考書で取り扱ってるものがあまりないので、
馴染みがありませんでした。

理解しておこうと思いますv-293
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。