C++:使 DLL 可同时被多个进程访问

Posted

技术标签:

【中文标题】C++:使 DLL 可同时被多个进程访问【英文标题】:C++: Making a DLL accessible to multiple processes concurrently 【发布时间】:2013-09-21 18:35:49 【问题描述】:

我在 C++ VS2010 中创建了一个 DLL。

在我看来,两个程序不能同时访问它。 首先程序 1 必须完成对 DLL 的调用,然后 DLL 才会处理来自其他程序的调用。

我想知道项目设置中是否有某个开关需要设置以使 DLL “多线程”。

该 DLL 由 Windows SAPI 使用。一个程序(在我的情况下是两个程序)可以引用 SAPI 并使计算机语音(计算机语音是 DLL)说出一些东西。我希望两个程序同时说话,但由于它们没有(它们相互等待),我希望我的 DLL 是单线程的。

谢谢。

【问题讨论】:

你能提供更多关于你在做什么的细节吗?两个程序不能同时使用同一个 DLL 应该没有理由。每个都将DLL加载到自己的内存空间中并独立执行代码。在现代操作系统上,任何一个进程都不会知道或访问另一个进程。 有一些原因可以显示为 tmighty 所描述的。它可能在持有装载机锁的同时做很多事情。它还可以在命名事件或其他同步原语上进行同步。我们无法知道所提供的信息。但我的钱在装载机锁上。 @MicahCaldwell 该 DLL 由 Windows SAPI 使用。一个程序(在我的情况下是两个程序)可以引用 SAPI 并使计算机语音(在我的情况下是 DLL)说出一些东西。我希望两个程序同时说话,但由于它们没有(它们相互等待),我希望我的 DLL 是单线程的。 鉴于这个新信息,它听起来不像是加载程序锁。它似乎更像是试图以独占方式访问音频设备,或者由于某种原因一次只有一个进程可以访问该设备。这超出了我的知识范围,但我认为我们都同意问题不在于 DLL 是如何编译的。需要对有争议的代码路径进行进一步调查。 为了测试 Jeffamaphone 刚刚评论的内容,我会将程序放在两个不同的文件夹中,其中包含两个不同的 DLL 副本。这样,如果它仍然无法正常工作,您肯定知道加载 DLL 没有问题,同时使用设备或类似问题也没有问题 【参考方案1】:

语音 API 会序列化来自多个来源的语音,因此它们不会同时播放。一个将首先播放,然后是下一个,依此类推,直到没有更多待播放的语音要播放。您可以通过注册表禁用此功能,如下所述: http://msdn.microsoft.com/en-us/library/ee431801(v=vs.85).aspx#_Toc494873956

尤其是HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Speech\AudioOutput\<AudioOutput1>\Attributes 中的NoSerializeAccess 值,其中<AudioOutput1> 是您的音频输出设备的名称。

此信息可在http://msdn.microsoft.com/en-us/library/speechplatform_ispaudio.aspx找到

为了防止多个 TTS 语音或引擎同时说话,语音平台将输出序列化到实现 ISpAudio 接口的对象。要禁用输出到 ISpAudio 对象的序列化,请在其对象标记的 Attributes 文件夹中放置一个名为“NoSerializeAccess”的属性。

【讨论】:

以上是关于C++:使 DLL 可同时被多个进程访问的主要内容,如果未能解决你的问题,请参考以下文章

高手解释一下.dll是啥?

常用动态链接库的DLL都有哪些?

从 C# 程序访问 C++ DLL 中的多个函数

动态数据库的啥是动态链接库?

是否可以通过 MS 绕道注入多个 Dll?

使用 C++ 从 32 位进程访问 64 位 dll