DLL 中的 Rtaudio 使程序无响应

Posted

技术标签:

【中文标题】DLL 中的 Rtaudio 使程序无响应【英文标题】:Rtaudio in DLL makes program unresponsive 【发布时间】:2014-03-06 09:32:22 【问题描述】:

我想用 C++ 创建一个 DLL,将声音传输到扬声器,并且我可以从 Visual Basic 程序中调用它。创建 dll 并从 VB 程序调用其函数是可行的。但是,一旦我在 DLL 中声明了一个 Rtaudio 对象,它就会使 Visual Basic 程序无响应(并且没有声音)。如果我在控制台应用程序项目中而不是在 DLL 中使用完全相同的代码,那么一切正常并且我听到声音。由于我在 DLL 编程方面缺乏经验,我完全不知道什么会导致这样的问题。你能给我一些提示吗?

这是我的代码的一部分。它仍然产生同样的问题: 动态链接库:

//C and C++ libraries
#define _USE_MATH_DEFINES
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <valarray>
#include <fstream>
#include <stdlib.h>
#include <map>
#include <math.h>
#include <stdint.h>
#include <algorithm>
#include <complex>
#include <cmath>
#include <iomanip>
#include <limits>
#include <time.h>
#include <fcntl.h>
#include <ctype.h>
#include <Windows.h>

//BOOST thread library for multi-threading
#include <boost\thread.hpp>

//Include RtAudio
#include <RtAudio.h>

#ifdef AUDIODLL1_EXPORTS
    #define AUDIODLL1_API __declspec(dllexport) 
#else
    #define AUDIODLL1_API __declspec(dllimport) 
#endif

RtAudio dac;       //If I leave this line out, everything works well

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)


    switch (ul_reason_for_call)
    
        case DLL_PROCESS_ATTACH:
            break;

        case DLL_THREAD_ATTACH:
            break;

        case DLL_THREAD_DETACH:          
            break;

        case DLL_PROCESS_DETACH:
            break;
    


    return TRUE;



AUDIODLL1_API int __stdcall getNumber()

    return 5;

这是 .def 文件:

LIBRARY AudioDll1
DESCRIPTION 'Audio DLL Test 1'

EXPORTS
    getNumber

这是VB示例代码:

Public Class Form1
    Private Declare Function getNumber Lib "AudioDll1.dll" () As Integer

    Dim myNum As Integer

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Label1.Text = 10

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Label1.Text = 1
        myNum = getNumber()
        Label1.Text = 2
        Label1.Text = myNum
    End Sub
End Class

正如我所说,唯一的问题是

RtAudio dac;

我尝试在本地声明它,将它放入线程等。没有任何效果。但是,如果我只是创建一个 win32 控制台应用程序,包含相同的标头,链接相同的库,一切正常。这些是我要链接的库:

dsound.lib
rtaudiolib.lib
kernel32.lib
user32.lib
advapi32.lib
ole32.lib

我不从父级或项目默认值继承。

哦,我知道即使它可以工作,使用上面的代码我也不会听到声音。正如我所说,我尝试删除部分代码以查找问题。和 RtAudio DAC;只需要引起它。

编辑:我还应该补充一点,rtaudiolib.lib 是我使用 Rtaudio 4.0.12 代码制作的静态库

#define __WINDOWS_DS__ 
#define __WINDOWS_ASIO__

我将非常感谢任何帮助。

最好的问候

【问题讨论】:

【参考方案1】:

RtAudio 构造函数正在调用 RtApiDs::getDeviceCount(),而 RtApiDs::getDeviceCount() 又调用了 DirectSoundEnumerate(),它是 dsound.dll 的一个函数。

我总是尝试在 DLL_PROCESS_ATTACH 期间(或在全局空间中,这似乎会导致同样的问题)声明 RtAudio 对象。

Microsoft 声明不应在 DLL_PROCESS_ATTACH 期间加载其他库。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583.aspx

入口点函数应该只执行简单的初始化或 终止任务。它不能调用 LoadLibrary 或 LoadLibraryEx 函数(或调用这些函数的函数),因为这可能 在 DLL 加载顺序中创建依赖循环。这可能会导致 在系统执行其初始化代码之前使用的 DLL。 同样,入口函数也不能调用 FreeLibrary 进程中的函数(或调用 FreeLibrary 的函数) 终止,因为这会导致 DLL 在 系统已经执行了它的终止代码。

所以我决定不在 DLL_PROCESS_ATTACH 中做任何事情,并为我的 DLL 设置一个单独的自定义 init() 函数。这解决了所有问题。

【讨论】:

以上是关于DLL 中的 Rtaudio 使程序无响应的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 内存警告会卸载 View Controller 并使应用程序无响应

使引导容器大小变大会使页面无响应

ckeditor 使页面无响应

保存到数据库使按钮无响应

Flexslider 视口高度在调整大小时无响应

Angular ngIf firebase 身份验证指令使 DOM 无响应