2014-10-18 85 views
2

所以我想製作一個簡單的DLL在另一個程序中播放聲音。我正在嘗試使用播放功能,並且已經設置了它,但是當我在另一個程序中運行它時,我得到了默認的嘟嘟聲。這是我的代碼。聲音不適用於PlaySound

export double sound_manage(const char* file_old,double handler) 
{ 
    /* 
    Handler values: 
    0 - Play sound 
    1 - Loop sound 
    2 - Stop sound 
    */ 
    bool good; 
    double ret; 
    double op; 
    if (handler == 0) op = SND_ASYNC; 
    if (handler == 1) op = SND_LOOP; 
    if (handler == 2) op = SND_PURGE; 
    LPCTSTR file; 
    file = LPCTSTR(file_old); 
    good = PlaySound(file,NULL,op); 
    ret = double(good); 
    return ret; 
} 

我已經在鏈接器中包含了winmib或其他東西,但是我不知道發生了什麼。

任何幫助,非常感謝!

回答

0

documentation包括以下內容:在fdwSound(SND_ALIAS,SND_FILENAME和SND_RESOURCE)

三旗 確定名字是否被解釋爲一個系統 事件的別名,文件名,或資源標識符。如果沒有指定這些標誌 ,則PlaySound會在註冊表或WIN.INI文件中搜索與指定聲音名稱關聯的 。

所以,如果你要玩磁盤上的文件,你必須包括SND_FILENAME標誌,例如:

if (handler == 0) op = SND_ASYNC | SND_FILENAME; 
if (handler == 1) op = SND_LOOP | SND_ASYNC | SND_FILENAME; 

別的東西,這條線可能是錯誤的:

file = LPCTSTR(file_old); 

如果你不用Unicode編譯,file_oldfile兼容,所以你不需要投。如果你用Unicode編譯,一個類型轉換是不夠的。

+0

我試過了,但同樣的事情發生。我不確定unicode,但我使用的是VC++ 2010,它告訴我如果我不投射是錯誤的。 – null 2014-10-18 22:57:28

+0

請參閱[這裏](http://stackoverflow.com/a/332086/33499)爲什麼類型轉換可能是危險的。如果可能的話,你應該儘量避免它。您應該使用[MultiByteToWideChar](http://msdn.microsoft.com/zh-cn/library/dd319072%28v=vs.85%29.aspx)來轉換字符串。但是如果你使用'PlaySoundA',它可能會更容易,應該避免類型轉換。 – wimh 2014-10-19 11:03:51

+0

我嘗試了多字節寬字符,它說錯了...另外,什麼是PlaySoundA? (我是C++新手。) – null 2014-10-20 23:20:21

0

如果您得到默認的嘟嘟聲,那很可能是找不到聲音文件。 PlaySound搜索當前目錄中的聲音文件,然後搜索windows目錄,然後搜索系統目錄,最後搜索PATH。