нормально, поэтому я на самом деле использую Axis Media Control SDK для взаимодействия с сетевой камерой (http://www.axis.com/techsup/cam_servers/dev/activex.htm). Функция OCX, которую я вызываю через оболочку, выглядит так:
HRESULT GetCurrentImage(int theFormat, [C++]
VARIANT* theBuffer,
LONG* theBufferSize
);
упаковщик поставляется Axis. Используя .NET Reflector, я отключил функцию-обертку;
public: virtual void __gc* GetCurrentImage(Int32 __gc* theFormat, [Out] Object __gc* *theBuffer, [Out] Int32 __gc* *theBufferSize)
{
if (this->ocx == 0)
{
throw __gc new InvalidActiveXStateException(S"GetCurrentImage", ActiveXInvokeKind::MethodInvoke);
}
this->ocx->GetCurrentImage(theFormat, out theBuffer, out theBufferSize);
}
Так что он не делает ничего умного, просто передает часть памяти. В синтаксисе C ++ CLI шаблон выглядит так:
GetCurrentImage(int theFormat, System::Object ^% theBuffer, int % theBufferSize)
Таким образом, мой вопрос заключается в том, как передать этот кусок памяти для записи и затем восстановить его обратно в объект .NET. Я попробовал это;
unsigned char c[100];
GetCurrentImage(0, (System::Object)c, BufSize);
но, очевидно, это не сработает.