這個簡單範例讓我花了許多時間,主要是因為 callback 函數使用 Borland Compiler 的時候必須額外加上 CALLBACK 或 __stdcall 修飾字,否則雖然編譯成功可是執行階段卻會莫名奇妙的當機,會發生這個問題主要應該是因為 Borland C++ Complier 預設的修飾字是 __fastcall,而 Visual C++ Compiler 預設應該是 __stdcall,這個修飾字主要是告訴編譯器函數被呼叫時的參數在堆疊中的放置規則,因此,程式才會在程式執行階段掛了 -_-b
記取教訓~~
原始檔
下載 (按右鍵下載,並將副檔名改為 rar)
/*
* 列舉系統中的支援 DiectSound 和 DirectSoundCapture 設備
*
* 相關檔案:
* [1] dsound.h
* [2] dsound.lib
*
* 環境:
* [1] Windows 2000 Professional
* [2] Edit Plus 2.12
* [3] Bolrnad C++ Compiler 5.6
* [4] DirectX 9.0 SDK
*
* 編譯:
* bcc32 dx.cpp
*
* 參考資料:
* [1] DSEnumCallback, http://msdn.microsoft.com/library/en-us/directx9_c/DSEnumCallback.asp
* [2] DirectSoundCaptureEnumerate, http://msdn.microsoft.com/library/en-us/directx9_c/DirectSoundCaptureEnumerate.asp
* [3] DirectSoundEnumerate, http://msdn.microsoft.com/library/en-us/directx9_c/DirectSoundEnumerate.asp
*
* 開發日誌:
* 2005/12/23 建立
*
*/
#include <iostream>
#include "windows.h"
#include "Includedsound.h"
#pragma link "Lib\dsound.lib"
using std::cout;
using std::endl;
using std::cerr;
BOOL CALLBACK DSEnumCallback(
LPGUID lpGuid,
LPCSTR lpcstrDescription,
LPCSTR lpcstrModule,
LPVOID lpContext
){
cout << lpGuid << "t"
<< lpcstrDescription << "t"
<< lpcstrModule << "t"
<< lpContext << endl;
return TRUE;
}
int main(){
cout << "sound list:n";
if ( DS_OK != DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumCallback, NULL) ) {
cerr << "DirectSoundEnumerate error n";
}
cout << endl;
cout << "sound capture list:n";
if ( DS_OK != DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)DSEnumCallback, NULL) ) {
cerr << "DirectSoundCaptureEnumerate error n";
}
return 0;
}
|
 |
Read Full Post »