初めて書き込みします。C++2005ネーティブコードを使っています。Direct X
を使って、サウンドキャプチャの列挙をさせたいのですが、
DirectSoundEnumerate((LPDESENUMCALLBACK)DSEnumProc,NULL);
を処理の途中で書き込み、
BOOL CALLBACK DSEnumProc(LPGUID lpGUID,LPCTSTR szName,LPCTSTR szDriverName, VOID* pContext){この中で処理をさせる
}
上のDirectSoundEnumerate()の行で
error C2440: '型キャスト' : 'overloaded-function'
から 'LPDSENUMCALLBACKW' に変換できません。 スコープ内でこの名前を指定された関数でターゲット型に一致するものはありません。 とエラー表示が出てしまいます。dsound.hもリンクしています。エラーの原因が良く分かりません。宜しくお願いいたします。
キャストの型間違ってはいないでしょうか?
>DirectSoundEnumerate((LPDESENUMCALLBACK)DSEnumProc,NULL);
>DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,NULL);
引用の>をまちがえて着けてしまいました。
訂正
>DirectSoundEnumerate((LPDESENUMCALLBACK)DSEnumProc,NULL);
DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,NULL);
あわてまして、書き込みが間違えていました。
DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)DSEnumProc,NULL)
でした。でも、Captureを付けたのみですので、これがエラーとなるので前に進みません。宜しく。
そもそもキャストしなくても渡せるのが正しいことなんだけどね。
MSDNでもキャストしている。悪いことだと思う。
念のためだけど
メンバ関数にしちゃ駄目だよ。
でもstaticなメンバ関数なら可能だ。
メンバ変数つまりthisが使えるようにしてあるメンバ関数は
そうでない関数と互換性ない。
VC2005でかなりコンパイラが昔よりよくなったが
この件のエラーメッセージはよくなってないね。
MSDNにある
if (FAILED(DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)DSEnumProc, NULL){
}
のように換えたりHRESULT hr = 等も色々試しましたが、エラー表示は同じです。
ちなみに、C++ Sampleソース:(SDK ルート)\Samples\C++\DirectSound\EnumDevicesから2005の
slnを呼び出してデバッグしてみたらエラーばかり。手がつけられません。 但し、DirectSoundCapture****の行にはエラー表示が出ていない。!
どこかチョット換えるだけでOKでしょうがお手上げですわ。宜しくお願いいたします。
最初に書くべきでしたが、私は、Visual Studio 2005のC++を使っています。
Visual C++2003とか2005では、DirectSoundCaptureCreate8等と8を付けますが、Visual Studio 2005ではエラーが出ますので8を付けていません。
微妙に違いが有りますので戸惑っています。サウンドデバイスの列挙でも、この僅かな違いで動かないのでしょうかね?
Microsoft Platform SDK for Windows Server 2003 R2
をダウンロードしたけど
Dsound.h
Dsound.lib
がなかった。
ということで俺にはDirectSoundCaptureCreateを使える状態にもって行く方法が判らない。
unicode対応で型が違うとか。
DirectSoundCaptureCreate8じゃなくて
DirectSoundCaptureCreateWとか。
DirectSoundCaptureCreateAにするか、
BOOL CALLBACK DSEnumCallback(
LPGUID lpGuid,
LPCTSTR lpcstrDescription,
LPCTSTR lpcstrModule,
LPVOID lpContext)
/*
実際はキャストできないからいいんだけどさ
もしキャストによってLPCTSTRとLPCSTRが違っていても
コンパイル成功したら問題だよな。
*/
DirectSoundか、最近DirectShowをみてたので間違えた。
編集 削除CALLBACK DSEnumProc()関数をヘッダーファイルにもPublicで書いていたのを消したら、列挙できました。 趣味の世界ですから別に急ぎませんが「たった」これだけで1ヶ月も悩みました。 ヘッダーファイルに書かないなんて常識外と思い込んでいました。
今度は、列挙できた中からサウンドカードを指定するのですが、はたして旨く行きますかどうか。終了時に何か注意点があればお願いしますね。SoundStopと別Threadの終了に加えて、COMの終了としてCoUninitialize(); だけで大丈夫ですか?
皆さんアドバイス有難うございました。
解決されてしまったようですが
クラスのメンバ関数を以下のように定義し
class CRecorderDlg {
・
・
static BOOL CALLBACK DSoundEnumCallback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext);
・
・
};
BOOL CALLBACK CRecorderDlg::DSoundEnumCallback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext)
{
ほげほげ;
}
としてやればうまくいきませんか?