所以我试图调用一个围绕OCX对象的manged包装器的函数。遇到很大困难。功能是;
foo(System::Object ^% theBuffer)
其中'theBuffer'是一个字节数组。 'foo'包装的非托管OCX的模板是
goo(VARIANT* theBuffer);
所以我试过了;
System::Int32 buf[10];
foo(buf);
失败了。和
Bitmap ^b;
foo(b);
编译,但很明显被调用的函数不会为我创建一个.NET位图。
所以我想问题是如何将这个函数传递给它可以写入的内存块,然后在.NET世界中访问它。
由于
答案 0 :(得分:1)
您无法直接将VARIANT
转换为缓冲区。
首先,您需要检查theBuffer->vt
,检查其中存储的对象类型。返回的值将是VARTYPE
类型。
答案 1 :(得分:0)
怎么样......
Bitmap ^b = gcnew Bitmap(...
foo(b);
答案 2 :(得分:0)
好吧我实际上是在使用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);
但显然它不起作用。