【问题标题】:PlayFunction doesn't work in DLL, but does work in standalone exe [duplicate]PlayFunction 在 DLL 中不起作用,但在独立 exe 中起作用 [重复]
【发布时间】: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 中执行很多事情 - 有什么办法可以解决这个问题吗?

【问题讨论】:

标签: c++ windows winapi dll


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 2015-07-11
  • 2017-09-14
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多