PlayFunction 在 DLL 中不起作用,但在独立 exe 中起作用 [重复]

Posted

技术标签:

【中文标题】PlayFunction 在 DLL 中不起作用,但在独立 exe 中起作用 [重复]【英文标题】:PlayFunction doesn't work in DLL, but does work in standalone exe [duplicate] 【发布时间】:2019-08-23 16:05:30 【问题描述】:

我正在尝试从 DLL 中播放音乐。但是,每当我尝试这样做时,PlaySound 函数什么都不做。

我已经尝试在资源中包含 wav 文件,并且我知道当我将 DLLMain 编译为普通主文件时,该代码可以正常运行,它可以毫无问题地播放音乐。 DLLMain 代码如下所示:

if (ul_reason_for_call == DLL_PROCESS_ATTACH) 
    PlaySoundA("C:\\Sound.wav", NULL, SND_FILENAME);


return TRUE;

奇怪的是,我可以看到这首歌在程序的记忆中;它的内存使用量上升到它播放歌曲时应该做的事情,但它没有声音。此外,编译为 exe 的相同代码也可以完美运行;我不知道出了什么问题。

更新: 事实证明这是因为您无法在 DLLMain 中执行很多事情 - 有什么办法可以解决这个问题吗?

【问题讨论】:

不要在 DllMain 中做任何有趣的事情:docs.microsoft.com/en-us/windows/win32/dlls/dllmain 【参考方案1】:

你只能在DllMain 中做a limited number of things,我很确定PlaySound 不是其中之一。

请尝试从 DLL 中的另一个函数调用它。

【讨论】:

有什么方法可以禁用 DLLMain 的限制吗?我从一个我无法控制的程序加载 DLL,所以我不能让它从 DLL 调用另一个函数。如果没有,有什么方法可以让进程调用 DLL 函数? @Aperture32 "有什么方法可以禁用 DLLMain 的限制吗?" 没有。请阅读链接的资料,了解它们最初存在的原因。跨度> @AlgirdasPreidžius,我不想在这里做任何危险的事情;我只是想播放一首歌,如果没有任何方法,你能告诉我是否有任何方法可以让 DLLMain 调用 DLL 中的另一个函数 @Aperture32:您可以从 DLLMain 执行的操作的规则不知道您的意图,因此它们极不可能为您的代码设置异常。您可以从 DLLMain 做什么和不能做什么是有据可查的,并且不可更改。不,您不能强制没有源代码的应用程序调用 DLL 中的函数;想想那将是多么大规模的安全漏洞。停止尝试强制其他应用程序播放您的音乐或声音。 @ape:你可以DllMain中创建一个线程。只要您不与DllMain 同步,该线程就没有任何限制。例如,它可以调用PlaySound

以上是关于PlayFunction 在 DLL 中不起作用,但在独立 exe 中起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

interop.MODI.dll 在 Windows Server 2012 中不起作用

php_redis.dll 在 Windows 中不起作用

不同版本(16、15、14)的 TFS API dll 在单个项目中不起作用

使用 cab 文件安装应用程序时,文化特定的字符串资源 dll 在 .net 紧凑框架中不起作用

boost :: asio :: steady_timer在boost :: dll中不起作用

php curl在本地主机中不起作用