0

Marshal.GetFunctionPointerForDelegate メソッドで取得した関数ポインタを使用して、C++ コードから呼び出される C# メソッド ReadBytesInTask があります。

ReadBytesInTask は、アンマネージ short[] 配列への ptr を取得し、それに値を設定して、アンマネージ コードに送り返します。配列はメソッド内でアンマネージ メモリに正しくアンマーシャリングされますが、C++ はデータが格納されていない配列しか取得しません。
私は何をすべきか?

[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Auto)]
private delegate int BytesReader([In,Out] IntPtr buffer, int samplesCount, string taskId);

private static readonly BytesReader _readBytesInTask = ReadBytesInTask;

private static int ReadBytesInTask(IntPtr buffer, int samplesCount)
{
    var bufferSize = samplesCount;              
    var samplesToRead = bufferSize <= task.Buffer.Length - task.Offset ? bufferSize : task.Buffer.Length - task.Offset;

    buffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(short))*samplesToRead);
    Marshal.Copy(task.Buffer, task.Offset, buffer, samplesToRead);

    task.Offset += samplesToRead;
    if (samplesToRead < bufferSize) task.Offset = 0;
    return samplesToRead;
}
4

1 に答える 1

0

ポインタを変更しているのであって、それが指しているものではありません。したがって、ポインタへのポインタが必要になります。したがって、次のようになります。

private static int ReadBytesInTask(IntPtr* buffer, int samplesCount)
于 2012-11-02T13:40:06.503 に答える