私の問題は、混合言語プログラミングの細かい点を理解し、外部ライブラリの 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 を返します。
パラメーター: device 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 は構造に関する情報を含む構造への POINTER を返し、関数が最初に構造を作成することを暗示しているため、これは間違っていると感じます。
私は混合言語プログラミング、C++ の完全な初心者、および貧弱な VB プログラマーにまったく慣れていません。この問題を解決するための正しい方法を教えてくれる人はいますか? 私の感じでは、DLL で作成されたメモリ内の構造体を参照するように VB を取得する方法を理解する必要があるため、関数の戻り値として「物へのポインター」を理解するように vb を取得する必要があります。
提供された支援に感謝します。ただ rtfm とは言わないでください。私は今、FM で目を覚ましています。どこを見ればいいのかわかりません。
どうもありがとう、デビッド