我想在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__
我非常感谢任何帮助。
祝你好运
答案 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()函数。这解决了所有问题。