指向C ++ / CLI包装器的指针

我正在尝试编写托管C ++ / CLI包装到非托管类。 其中一种方法有类似的签名

audiodecoder::Decode(byte *pEncodedBuffer, unsigned int uiEncodedBufLen, byte **pDecodedAudio, unsigned int *uiDecodedAudioLen)

其中* pEncodedBuffer是编码音频采样的指针,** pDecodedAudio是函数初始化内存并存储解码音频的位置。 事实上,数据是音频应该是没有任何意义的。

这个方法的包装会如何? 任何建议都会有所帮助。


托管代码的一个好处是它使用垃圾回收器并且具有强类型的数组。 所以很好的支持返回数组作为函数返回值。 这使你理想的包装功能如下所示:

  array<Byte>^ Wrapper::Decode(array<Byte>^ encodedBuffer) {
      pin_ptr<Byte> encodedPtr = &encodedBuffer[0];
      Byte* decoded = nullptr;
      unsigned int decodedLength
      int err = unmanagedDecoder->Decode(encodedPtr, encodedBuffer->Length, &decoded, &decodeLength);
      // Test err, throw an exception
      //...
      array<Byte>^ retval = gcnew array<Byte>(decodedLength);
      Marshal::Copy((IntPtr)decoded, retval, 0, decodedLength);
      free(decoded);   // WATCH OUT!!!
      return retval;
  }

请注意// WATCH OUT评论。 您需要销毁解码器分配的缓冲区。 正确地做到这一点需要知道解码器如何管理其内存,并且通常使得C ++ / CLI代码与解码器模块共享相同的CRT非常重要。 如果没有好的协议或者你无法编译解码器源代码,这往往会出错。

链接地址: http://www.djcxy.com/p/27807.html

上一篇: Pointer to a pointer C++/CLI wrapper

下一篇: Calling C++ Library from C# with C++/CLI Wrapper