DLL中的Rtaudio使程序无响应

时间:2014-03-06 09:32:22

标签: c++ vb.net audio dll

我想在C ++中创建一个DLL,它将声音传输到扬声器,我可以从Visual Basic程序调用。从VB程序创建dll并调用其函数。但是,只要我在DLL中声明一个Rtaudio对象,它就会使Visual Basic程序无响应(并且没有声音)。如果我在控制台应用程序项目中使用完全相同的代码而不是在DLL中,一切正常,我听到声音。由于我在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 个答案:

答案 0 :(得分:0)

RtAudio构造函数调用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加载顺序中创建依赖循环。这可能导致a   在系统执行其初始化代码之前使用DLL。   同样,入口点函数也不能调用FreeLibrary   函数(或调用FreeLibrary的函数)在进程中   终止,因为这可能导致在之后使用DLL   系统已执行终止代码。

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

相关问题