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

标签 c++ pointers 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 非常重要。如果没有好的协议(protocol)或无法编译解码器源代码,这往往会出错。

关于c++ - 指向指针 C++/CLI 包装器的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19576284/

相关文章:

c# - 在同一解决方案中的 C# 项目和 C++ 项目之间进行交互

.net - 将 std::time_t 转换为 System::DateTime 的标准符合方式?

.net - 从非托管 C++ 动态加载混合模式 C++/CLI .dll(和依赖项)

c++ - 在 OS X 上安装 Boost 1.48.0

c - 将 char 数组类型转换为 char **

c - 将字符串作为指针传递给函数

c - 如何将函数和变量参数列表传递给 C 中的另一个函数?

c++ - 如何为 vector 的前n个元素赋值? C++

c++ - 如何创建动态数组

C++ : convert symbols to code line numbers programmatically