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

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

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

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

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

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

Работа с VARIANT
Добрый день. Есть функция STDMETHODIMP MyClass::InitiateRequest(VARIANT* pVal) { byte mac = {...

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

21
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
01.06.2015, 10:13 2
Костяныч, нужно больше кода.
Пока делайте аналогично только вместо byte - unsigned char.
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 11:30  [ТС] 3
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 4
Цитата Сообщение от Костяныч Посмотреть сообщение
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  [ТС] 5
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 6
Цитата Сообщение от Костяныч Посмотреть сообщение
но у меня проект на C# + библиотека на C++.
Библиотека на плюсках твоя?

Цитата Сообщение от Костяныч Посмотреть сообщение
Value.vt = VT_DATE;
Там вроде было что - то вроде VT_ARRAY
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 13:08  [ТС] 7
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 8
Цитата Сообщение от Костяныч Посмотреть сообщение
IBM, да, на плюсах.
Что да, библиотека на плюсах твоя? Ты её писал?
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 13:12  [ТС] 9
IBM, вы вопрос задали, я ответил на него. Вы его снова задаете. Ну ладно, еще раз отвечу подробно: Да, библиотека на плюсах.
Правильный ответ с переводом массива byte в variant описал в последнем посте.
0
Заблокирован
01.06.2015, 13:21 10
Цитата Сообщение от Костяныч Посмотреть сообщение
вы вопрос задали, я ответил на него.
ты на него не ответил
Цитата Сообщение от Костяныч Посмотреть сообщение
Вы его снова задаете
потому что ты на него не ответил
Цитата Сообщение от Костяныч Посмотреть сообщение
Ну ладно, еще раз отвечу подробно: Да, библиотека на плюсах.
Что да? Причём тут плюсы?
Я тебя спрашиваю ещё раз, ты сам код этой библиотеки писал или нет?

Цитата Сообщение от Костяныч Посмотреть сообщение
Правильный ответ с переводом массива byte в variant описал в последнем посте.
Переводить его можно по разному, всё зависит от того, что с этим вариантом впоследствии делается, по этому я и спрашивал тебя про доступ к коду функции библиотеки.
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 13:25  [ТС] 11
IBM, библиотекой пользуюсь сторонней. Исходник ее есть. Пока скомпилировалось, правильность логики не проверил еще. Как будут проблемы по этой теме, отпишусь.
0
Заблокирован
01.06.2015, 13:28 12
Такое ощущение, что ты хочешь передать в функцию хоть что - то, что бы код собрался
В функцию следует передавать то, что нужно, а для этого следует читать документацию на функцию/ библиотеку или смотреть её исходники.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:13  [ТС] 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 14
В общем мне лень гуглить за тебя
Конечно, ты не так массив туда суёшь, там вроде бы в варианте для массива есть parray,
короче гугли по фразе SAFEARRAY to VARIANT или что - то в этом духе...
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:19  [ТС] 15
но запустив компилятор и посмотрев значения переменной...там только 0x00, а должно быть 0x00 0x01...
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.06.2015, 14:31 16
чай в дебаггере посмотрили? лучше распечатайте, а то по указателю только первый элемент дебагер и покажет
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:34  [ТС] 17
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  [ТС] 18
aLarman, что такое чай?
0
Заблокирован
01.06.2015, 14:49 19
Цитата Сообщение от Костяныч Посмотреть сообщение
что именно проверять на предмет наличия моих значений?
Ну судя по твоему коду, ты 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 20
Цитата Сообщение от Костяныч Посмотреть сообщение
aLarman, что такое чай?
== наверное
0
01.06.2015, 14:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2015, 14:51
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru