Как поместить SAFEARRAY (массив байтов) в скрытое поле HTML - PullRequest
0 голосов
/ 05 июля 2011

Я бы хотел получить массив байтов из компонента active-x, сохранить его в скрытом поле ввода html-формы, а затем передать его на сервер через форму отправки.Как я могу это сделать?

MIDL:

HRESULT Data([out, retval] SAFEARRAY(VARIANT) *pArray);

C ++ / ATL

STDMETHODIMP MyActiveX::get_Data(SAFEARRAY **pArray)
{
    CComSafeArray<BYTE> arr;    
    for (int i = 0; i < 10; i++)
    {
        CComVariant a;
        a = (BYTE)i;
        arr.Add(a);
    }

    arr.CopyTo(pArray);
    return S_OK;
}

Javascript:

  $("#hiddenField").val(myActiveX.Data);

Браузер сообщает мне: несоответствие типов

Ответы [ 2 ]

1 голос
/ 05 июля 2011

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

Вы правильно указали свои данные в поле, используя $('#hiddenField').Если вы поместили атрибут name в это поле, чтобы он стал частью отправки HTTP, эта часть хороша.

Что касается myActiveX.Data, я думаю, что это какой-то объект JavaScript,Помните, что только входная строка может быть введена в HTML-код;он не содержит двоичных данных.

Я бы поставил точку останова перед $("#hiddenField").val(myActiveX.Data); .Используйте ключевое слово debugger, если вы не знакомы с ним.Запустите код в вашем отладчике и посмотрите на структуру значения myActiveX.Data.Возможно, в нем есть какое-то поле-обертка.

В качестве альтернативы, если у вас нет доступа к хорошему отладчику JavaScript, попробуйте следующее "

for(x in myActiveX.Data)
 alert(x + ": " + myActiveX.Data[x]);
0 голосов
/ 06 июля 2011

Я предполагаю, что код C ++ - это код на стороне сервера.

Лучший способ справиться с этим - сериализовать SAFEARRAY. Оттуда вы можете справиться с этим двумя способами.

Во-первых, сериализация. Я посмотрел на MSDN и думаю, что LPSAFEARRAY_Marshal и LPSAFEARRAY_Unmarshal (с необязательным IDispatch или IUnknown IID для указания типа, но в документации не сказано, как используется) или LPSAFEARRAY_UserMarshal и LPSAFEARRAY_UserUnmarshal для преобразования SAFEARRAY в / из сериализованного формата.

Во-вторых, обработка передачи данных.

  • Вариант 1. Сохраните сериализованные данные на стороне сервера и поместите токен, представляющий сохраненный файл, в скрытое поле.
  • Вариант 2. Используйте Hex, Base64 и т. Д. Для кодирования данных в печатный формат и помещения этих данных в скрытое поле.

В любом случае, когда вам нужно вернуть данные, просто десериализуйте их с помощью соответствующей функции.

...