Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2

Работа с byte (Помещение а Variant)

01.06.2015, 10:10. Показов 3504. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
В C# массив байт и переменная типа байт создаются так:
C#
1
2
byte[] data1 = {0x01, 0x02};
byte data2 = 0x22
. Я эти значения могу передать в функцию на C++, которая примет массив как variant, а byte как byte (typedef unsigned char BYTE).
У меня вопрос. Как эти переменные объявить на самом C++, для передачи в аналогичную функцию?
Я так понимаю массив надо будет конвертировать в VARIANT?
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.06.2015, 10:10
Ответы с готовыми решениями:

Из Variant получить массив Byte
Добрый день. У меня есть переменная типа Variant, она содержит значения, скажем 0x55 0x55. Как мне ее конвертировать в массив byte? ...

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы Проблемы c процедурами Pos и Chang: пос...

Работа с VARIANT
Добрый день. Есть функция STDMETHODIMP MyClass::InitiateRequest(VARIANT* pVal) { byte mac = { 0x00, 0x8a, 0x0C, 0x98, 0x11, 0x15 }; ...

21
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
01.06.2015, 10:13
Костяныч, нужно больше кода.
Пока делайте аналогично только вместо byte - unsigned char.
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 11:30  [ТС]
S_el, Вот например из C# я вызываю функцию библиотеки на C++:
C#
1
2
3
byte[] data1 = {0x01, 0x02};
byte data2 = 0x22
Class.func(data1, data2);
Сама функция на c++ имеет следующую сигнатуру:
C++
1
func(VARIANT Value, BYTE Type);
Вот я и спрашиваю, как мне параметры "0x01, 0x02" и "0x22" из под C++ передать в эту функцию библиотеки?

Добавлено через 47 минут
Надо ли byte в VARIANT переводить, если да, то как?
0
Заблокирован
01.06.2015, 11:38
Цитата Сообщение от Костяныч Посмотреть сообщение
VARIANT
Это не плюсовая штука, точнее она не входит в стандарт, это чисто WinApi-ашный наворот (или VisualStudio-йная)
Вот определение:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;
 
struct tagVARIANT
    {
    union 
        {
        struct __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown *punkVal;
                IDispatch *pdispVal;
                SAFEARRAY *parray;
                BYTE *pbVal;
                SHORT *piVal;
                LONG *plVal;
                LONGLONG *pllVal;
                FLOAT *pfltVal;
                DOUBLE *pdblVal;
                VARIANT_BOOL *pboolVal;
                _VARIANT_BOOL *pbool;
                SCODE *pscode;
                CY *pcyVal;
                DATE *pdate;
                BSTR *pbstrVal;
                IUnknown **ppunkVal;
                IDispatch **ppdispVal;
                SAFEARRAY **pparray;
                VARIANT *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                ULONGLONG ullVal;
                INT intVal;
                UINT uintVal;
                DECIMAL *pdecVal;
                CHAR *pcVal;
                USHORT *puiVal;
                ULONG *pulVal;
                ULONGLONG *pullVal;
                INT *pintVal;
                UINT *puintVal;
                struct __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo *pRecInfo;
                    }   __VARIANT_NAME_4;
                }   __VARIANT_NAME_3;
            }   __VARIANT_NAME_2;
        DECIMAL decVal;
        }   __VARIANT_NAME_1;
    } ;
typedef VARIANT *LPVARIANT;
 
typedef VARIANT VARIANTARG;
 
typedef VARIANT *LPVARIANTARG;


в его составе есть BYTE *pbVal;, используй это как указатель на массив типа BYTE.
А вообще собственно, как ты собрался из шарпа плюсовую функцию вызывать, да ещё пытаясь передать в С++ шарповые переменные... Эту проект CLI ?
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 11:43  [ТС]
IBM, я не знаю, но у меня проект на C# + библиотека на C++.
А сейчас на C++ пишу.
Вот так я дату в вариант помещаю
C++
1
2
3
4
VARIANT Value;
  VariantInit(&Value);
  Value.vt = VT_DATE;
  Value.date = Time.Val;
А как с массивом байт быть?
0
Заблокирован
01.06.2015, 12:04
Цитата Сообщение от Костяныч Посмотреть сообщение
но у меня проект на C# + библиотека на C++.
Библиотека на плюсках твоя?

Цитата Сообщение от Костяныч Посмотреть сообщение
Value.vt = VT_DATE;
Там вроде было что - то вроде VT_ARRAY
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 13:08  [ТС]
IBM, да, на плюсах.
а здесь вместо date что ставить?
C++
1
Value.date = Time.Val;
Добавлено через 3 минуты
IBM, сделал так:
C++
1
2
3
4
5
byte value[2] = {0x00, 0x03};                                                   
  VARIANT V;
  VariantInit(&V);
  V.vt = VT_ARRAY;
  V.pbVal = value.Val;
Выпадает ошибка: E2294 Structure required on left side of . or .*

Добавлено через 57 минут
C++
1
2
3
4
VARIANT Value;
  VariantInit(&Value);
  Value.vt = VT_ARRAY;
  Value.pbVal = value2;
0
Заблокирован
01.06.2015, 13:10
Цитата Сообщение от Костяныч Посмотреть сообщение
IBM, да, на плюсах.
Что да, библиотека на плюсах твоя? Ты её писал?
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 13:12  [ТС]
IBM, вы вопрос задали, я ответил на него. Вы его снова задаете. Ну ладно, еще раз отвечу подробно: Да, библиотека на плюсах.
Правильный ответ с переводом массива byte в variant описал в последнем посте.
0
Заблокирован
01.06.2015, 13:21
Цитата Сообщение от Костяныч Посмотреть сообщение
вы вопрос задали, я ответил на него.
ты на него не ответил
Цитата Сообщение от Костяныч Посмотреть сообщение
Вы его снова задаете
потому что ты на него не ответил
Цитата Сообщение от Костяныч Посмотреть сообщение
Ну ладно, еще раз отвечу подробно: Да, библиотека на плюсах.
Что да? Причём тут плюсы?
Я тебя спрашиваю ещё раз, ты сам код этой библиотеки писал или нет?

Цитата Сообщение от Костяныч Посмотреть сообщение
Правильный ответ с переводом массива byte в variant описал в последнем посте.
Переводить его можно по разному, всё зависит от того, что с этим вариантом впоследствии делается, по этому я и спрашивал тебя про доступ к коду функции библиотеки.
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 13:25  [ТС]
IBM, библиотекой пользуюсь сторонней. Исходник ее есть. Пока скомпилировалось, правильность логики не проверил еще. Как будут проблемы по этой теме, отпишусь.
0
Заблокирован
01.06.2015, 13:28
Такое ощущение, что ты хочешь передать в функцию хоть что - то, что бы код собрался
В функцию следует передавать то, что нужно, а для этого следует читать документацию на функцию/ библиотеку или смотреть её исходники.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:13  [ТС]
IBM, пока так и хочу сделать, потом залезать в функцию и проверять...

Добавлено через 39 минут
IBM, в общем не сработало...
У меня далее идут операции
C++
1
2
3
4
5
6
const VARIANT* FValue = &Value;
BYTE* FromBuffer = NULL;
long size = 2;
CGXVariant tmp;
VariantCopy(&tmp, FValue);
tmp.GetDataAsBytes(&FromBuffer, &size, GX_VT_NONE);
Value - Это переменная в сигнатуре. Я ее заполняю как указал в посте 7.
0
Заблокирован
01.06.2015, 14:18
В общем мне лень гуглить за тебя
Конечно, ты не так массив туда суёшь, там вроде бы в варианте для массива есть parray,
короче гугли по фразе SAFEARRAY to VARIANT или что - то в этом духе...
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:19  [ТС]
но запустив компилятор и посмотрев значения переменной...там только 0x00, а должно быть 0x00 0x01...
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.06.2015, 14:31
чай в дебаггере посмотрили? лучше распечатайте, а то по указателю только первый элемент дебагер и покажет
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:34  [ТС]
IBM, нагуглил и использовал следующее:
C++
1
2
3
4
5
6
7
8
9
10
VARIANT To;                 //осуществляет необходимые вызовы функций VariantInit и VariantClear
    To.vt = VT_ARRAY | VT_UI1;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].cElements = 2;
    rgsabound[0].lLbound = 0;
    To.parray = SafeArrayCreate(VT_UI1, 1, rgsabound);
    void * pArrayData = NULL;
    SafeArrayAccessData(To.parray, &pArrayData);
    memcpy(pArrayData, Value, 2);
    SafeArrayUnaccessData(To.parray);
Передаю я переменную To в функцию и смотрю дебагером, что там есть. Там много данных, что именно проверять на предмет наличия моих значений?
А отправлял я 0x00 0x03.
Миниатюры
Работа с byte (Помещение а Variant)  
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:34  [ТС]
aLarman, что такое чай?
0
Заблокирован
01.06.2015, 14:49
Цитата Сообщение от Костяныч Посмотреть сообщение
что именно проверять на предмет наличия моих значений?
Ну судя по твоему коду, ты SAFEARRAY загоняешь в parray, вроде так и надо, значит в parray и смотри. Там вроде указатель на SAFEARRAY, а читать из него так же геморойно, как и писать в него, вот что нагуглил (хотя это должен был делать ты)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// get them from somewhere. (I will assume that this is done 
// in a way that you are now responsible to free the memory)
SAFEARRAY* saValues = ... 
LONG* pVals;
HRESULT hr = SafeArrayAccessData(saValues, (void**)&pVals); // direct access to SA memory
if (SUCCEEDED(hr))
{
  long lowerBound, upperBound;  // get array bounds
  SafeArrayGetLBound(saValues, 1 , &lowerBound);
  SafeArrayGetUBound(saValues, 1, &upperBound);
 
  long cnt_elements = upperBound - lowerBound + 1; 
  for (int i = 0; i < cnt_elements; ++i)  // iterate through returned values
  {                              
    LONG lVal = pVals[i];  
    //Костяныч, ВОТ ТУТ СМОТРИ!  Ты получил один элемент массива
    //в виде LONG, теперь ты можешь смело кастить его во что хочешь, допустим в свой байт.
    std::cout << "element " << i << ": value = " << lVal << std::endl;
  }       
  SafeArrayUnaccessData(saValues);
}
SafeArrayDestroy(saValues);
1
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.06.2015, 14:51
Цитата Сообщение от Костяныч Посмотреть сообщение
aLarman, что такое чай?
== наверное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.06.2015, 14:51
Помогаю со студенческими работами здесь

Работа с полями Variant
Доброй ночи. Такой вопрос. Есть поле в Excel типа Variant, в нем находится изображение. Как выгрузить из Excel данные я знаю. Как...

Работа с типом данных VARIANT
Всем привет. Сейчас работаю с некоторой динамической библиотекой(*.dll). Пытаюсь из этой dll использовать некую функцию GetTitleIDList....

Работа с byte[]
Подскажите пожалуйста литературу о том, как работать с битами в C/C#. Дело в том, что реализовал алгоритм хэширования на C# используя...

'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Работаю с библиотеками PIL и telebot В чем может быть проблема ? Ошибка - 'utf-8' codec can't decode byte 0xff in position 0:...

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 - invalid start byte
Добрый день При вызове скрипта вылетает такая ошибка: &quot;UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru