2014-10-18 82 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。

相关问题