C ++ CLI вызов загадочной функции - PullRequest
1 голос
/ 04 февраля 2009

Итак, я пытаюсь вызвать функцию, которая является управляемой оболочкой вокруг объекта OCX. Имея большие трудности. Функция есть;

foo(System::Object ^% theBuffer)

где 'theBuffer' - это массив байтов. Шаблон для неуправляемого OCX, который упаковывается в 'foo':

goo(VARIANT* theBuffer);

Итак, я пытался;

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

, что не удается. И

Bitmap ^b;
foo(b);

, который компилируется, но, очевидно, вызываемая функция не собирается создавать для меня растровое изображение .NET.

Итак, я думаю, вопрос в том, как передать этой функции блок памяти, в который она может записать, и затем получить доступ к ней обратно в мире .NET.

Спасибо

Ответы [ 3 ]

1 голос
/ 04 февраля 2009

Вы не можете конвертировать VARIANT в буфер напрямую.

Сначала вам нужно проверить, какой объект хранится в нем, проверив theBuffer->vt. Возвращаемое значение будет иметь тип VARTYPE.

0 голосов
/ 04 февраля 2009

нормально, поэтому я на самом деле использую 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);

но, очевидно, это не сработает.

0 голосов
/ 04 февраля 2009

Как насчет чего-то вроде ..

Bitmap ^b = gcnew Bitmap(...
foo(b);
...