Что я делаю не так с моими SAFEARRAY? [дубликат]C#

Место общения программистов C#
Ответить
Anonymous
 Что я делаю не так с моими SAFEARRAY? [дубликат]

Сообщение Anonymous »

Я делаю свои первые шаги в COM-коммуникации. У меня есть приложение, написанное на C#, использующее массив байтов, и оно работает нормально.

Когда я пытаюсь сделать то же самое на C++, оно не работает.
Я сделал два снимка Wireshark, на которых четко видны различия.
Это скриншот хорошей ситуации:

Изображение

Это скриншот плохой ситуации:

Изображение

Вы можете ясно видеть два байта cccc, добавленные к данные C++.
Для вашей информации: в приложении C# я использую следующий исходный код для преобразования массива байтов в объект для отправки:

Код: Выделить всё

byte[] requestCounters = new byte[] { 0xFF, 0xFF };
dataCounters = (object) requestCounters;
В приложении C++ (неудачном) это выглядит следующим образом:

Код: Выделить всё

BYTE bData_Counters[] = {0xFF, 0xFF};
_variant_t data_Counters = from_ByteArray(bData_Counters); // new byte[] { 0xFF, 0xFF };
Функция from_ByteArray() выглядит следующим образом:

Код: Выделить всё

_variant_t from_ByteArray(BYTE input[])
{
long dataCount = sizeof(input) / sizeof(BYTE);

// Create a SAFEARRAY to hold the bytes
SAFEARRAYBOUND sabound;
sabound.lLbound = 0;
sabound.cElements = dataCount;

SAFEARRAY* psa = SafeArrayCreate(VT_UI1, 1, &sabound); // VT_UI1 = unsigned byte

// Copy the bytes into the SAFEARRAY
void* pArrayData = nullptr;
SafeArrayAccessData(psa, &pArrayData);
memcpy(pArrayData, input, dataCount);
SafeArrayUnaccessData(psa);

// Wrap the SAFEARRAY in a VARIANT (via _variant_t)
_variant_t data;
data.vt = VT_ARRAY | VT_UI1;
data.parray = psa;
return data;
}
Почему C++ добавляет к данным два байта?

Есть ли у кого-нибудь идеи?


Подробнее здесь: https://stackoverflow.com/questions/798 ... safearrays
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»