C ++ CLI神秘函数调用

时间:2009-02-04 17:12:01

标签: c# c++-cli marshalling

所以我试图调用一个围绕OCX对象的manged包装器的函数。遇到很大困难。功能是;

foo(System::Object ^% theBuffer)

其中'theBuffer'是一个字节数组。 'foo'包装的非托管OCX的模板是

goo(VARIANT* theBuffer);

所以我试过了;

System::Int32 buf[10];
foo(buf);

失败了。和

Bitmap ^b;
foo(b);

编译,但很明显被调用的函数不会为我创建一个.NET位图。

所以我想问题是如何将这个函数传递给它可以写入的内存块,然后在.NET世界中访问它。

由于

3 个答案:

答案 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);

但显然它不起作用。