Рассмотрим следующий управляемый класс:
public ref class DataProvider
{
public:
static int ReadData(void* handlePtr, unsigned char* buffer, int cnt)
{
if (handlePtr == nullptr)
{
return -1;
}
GCHandle handle = GCHandle::FromIntPtr(IntPtr::IntPtr(handlePtr));
System::IO::Stream^ _stream = dynamic_cast<System::IO::Stream^>(handle.Target);
if (_stream == nullptr)
{
return -1;
}
array<unsigned char>^ data = gcnew array<unsigned char>(cnt);
pin_ptr<unsigned char> dataPtr = &data[0];
int read = stream->Read(data, 0, cnt);
if (read > 0)
{
memcpy(buffer, dataPtr, cnt);
}
return read;
}
}
ReadData
метод вызывается посредством обратного вызова из неуправляемого кода.Это работает, но выделяет временный буфер data
.Это выглядит чрезмерно.
Вопрос : Можно ли передать оригинальный buffer
в stream->Read
метод и устранить выделение этого дополнительного data
буфера?