我正在尝试为非托管类编写托管 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/