我的问题是理解混合语言编程和访问外部库中的 API 的更好点。我在 C++ 方面的技能不存在,而在 VB 方面则平庸。
我编译了一个 c++ dll(portaudio 库),并试图从 VB(Visual Studio 2005)访问它。我在调用函数时遇到 MarshallDirectiveException 错误,我相信是因为我与 dll 交互不正确。
C++ 函数和结构定义如下:
标题信息:
typedef int PaHostApiIndex;
...
typedef double PaTime;
...
typedef struct PaDeviceInfo
{
int structVersion; /* this is struct version 2 */
const char *name;
PaHostApiIndex hostApi; /* note this is a host API index, not a type id*/
int maxInputChannels;
int maxOutputChannels;
PaTime defaultLowInputLatency;
PaTime defaultLowOutputLatency;
PaTime defaultHighInputLatency;
PaTime defaultHighOutputLatency;
double defaultSampleRate;
} PaDeviceInfo;
...
const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device );
文档中的程序用法:
const PaDeviceInfo* Pa_GetDeviceInfo ( PaDeviceIndex device )
检索指向包含指定设备信息的 PaDeviceInfo 结构的指针。
返回: 指向不可变 PaDeviceInfo 结构的指针。如果设备参数超出范围,则函数返回 NULL。
参数:设备 0 到 (Pa_GetDeviceCount()-1) 范围内的有效设备索引
在VB程序中,我有:
Private Declare Function Pa_GetDeviceInfo Lib "portaudio_x86.dll" (ByVal dindex As Integer) As PaDeviceInfo
...
Private Structure PaDeviceInfo
Dim structVersion As Integer
<MarshalAs(Runtime.InteropServices.UnmanagedType.LPStr)> Dim name As String
Dim hostapi As Integer
Dim maxInputChannels As Integer
Dim maxOutputChannels As Integer
Dim defaultLowInputLatency As Double
Dim defaultLowOutputLatency As Double
Dim defaultHighInputLatency As Double
Dim defaultHighOutputLatency As Double
Dim defaultSampleRate As Double
End Structure
...
Dim di As New PaDeviceInfo
di = Pa_GetDeviceInfo(outputParameters.device)
这感觉是错误的,因为文档状态 Pa_GetDeviceInfo 返回一个指向包含结构信息的结构的指针,这意味着函数最初创建了结构。
我对混合语言编程完全陌生,完全是 C++ 菜鸟,也是一个糟糕的 VB 程序员。谁能指导我以正确的方式解决这个问题?我的感觉是我需要了解如何让 VB 引用在 dll 中创建的内存中的结构,所以我需要让 vb 将“指向事物的指针”理解为函数返回。
非常感谢提供的任何帮助。请不要只说 rtfm,我现在在 FM 中取决于我的眼睛,我只是不知道在哪里看。
非常感谢,大卫