powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / olevariant и variant
25 сообщений из 25, страница 1 из 1
olevariant и variant
    #33088782
tokito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем дело в следующем, одна софтина имеет DCOM, один из методов которого возвращает VARIANT v, что есть ClientDataSet->Data

так как под эту софтину, все пишут в делфях, то у них не возикает фопросов о присвоении на свой клиентдатасет, типа
Код:
ClientDataSet1.Data := v;

и все пркрасно, однако если писать в билдере, ведь ClientDataSet->Data этоже OleVariant, и если сделать вот так
Код:
ClientDataSet1->Data = (OleVariant)v;

то будет ругань в библиотеке utilcls.h access violation тра ля-ля на выходе функции
Код:
TVariantT(const VARIANT& src)
{
/* always copies the other variant. */
::VariantInit(this);
::VariantCopy(this, const_cast<VARIANTARG*>(&src));
}

А если сделать, что то типа
Код:
ClientDataSet1->Data = v.parray;

то выдется эксепшеновое Invalid Data Packet

что-то мне подсказывает что надо с помощью SAFEARRAY мутить, но все равно не пойму как.

Кто-нить чё-нить может сказать по этому поводу ???
...
Рейтинг: 0 / 0
olevariant и variant
    #33090194
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.rsdn.ru/article/com/varsafearr.xml#XSLTPART139120120
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
olevariant и variant
    #33096669
tokito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо большое что ответили, вы единственный во всем нете..

все это очень хорошо, но ничего особо нового я не прочитал, таак.. перевод английских мануалов по АПИ..

вопрос вот в чем, метод DCOM, возвращает VARIANT, и в документации написано что это мол самый что ни на ечть Delphi' ский ClientDataSet.Data или ClientDataSet.XMLData (не суть важно).

Так вот отрабатывает этот метод и в VARIANT *v:
v->vt = 0x2011
то есть VT_SAFEARRAY + какая-то еще хрень

пишем дальше
SAFEARRAY *sa = new SAFEARRAY;
sa = var->parray;
в результате *sa:
{ 65262, 65262, 4277075694, 4277075694, :FEEEFEEE, {4277075694, -17891602}}

что за инвалидство??

и еще раз повторяю ГЛАВНЫЙ вопрос, что за эксепшеновые ошибка
"Invalid Data Packet"
или "Mismatch in Data Packet"

вылазиющие всякий раз при попытке
TClientDataSet1->Data = v; // v->parray;

???????
...
Рейтинг: 0 / 0
olevariant и variant
    #33097272
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
ClientDataSet1->Data = (OleVariant)v; 
Я не силён в коде на С++.
2. Попробуй по частям:
- проверить тип варианта переменной v
- получить/скопировать её в другой участок памяти, сначала разблокировав vararray
- посмотреть размер массива в Delphi и на С++
......
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
olevariant и variant
    #33097294
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не для твоего случая но может поможет
Код: plaintext
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.
               type
                  PArrayData = ^TArrayData;
                  TArrayData = array[ 0 .. 7000 ] of byte;
                var
                  tmpStream   : TMemoryStream;
                  varData     : Variant;
                  Parr        : PArrayData;
                  longSize    : LongInt;
                begin
                  tmpStream := TMemoryStream.Create;
                  try
                    varData := FProc_ap_Ts_GetListObj.FieldByName('properti').Value;
                    if varData <> Null then
                    begin
                      Parr := VarArrayLock(varData);
                      try
                        System.Move(Parr^[ 0 ], longSize, SizeOf(longSize)); 
                        tmpStream.Write(Parr^[ 0  + SizeOf(longSize)],longSize);
                      finally
                        VarArrayUnlock(varData);
                      end;
                      tmpStream.Position :=  0 ;
                      ...............................
                    end;
                  finally
                    tmpStream.Free;
                    VarClear(varData);
                  end;
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
olevariant и variant
    #33097393
tokito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
type
                  PArrayData = ^TArrayData;
                  TArrayData = array[ 0 .. 7000 ] of byte;

вот это мне не ясно, это что вообще такое? почему 7000??? зачем это все надо? что такое у вас там в ващем объектом паскале ^ ??
...
Рейтинг: 0 / 0
olevariant и variant
    #33097451
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
задача - получить с сервера DataSet из BLOB (там записан байтовый массив - например exe/doc/tiff)
- объявляем тип перемнной массив байт 0....7000
- PArrayData - указатель на него.
Код: plaintext
 Parr := VarArrayLock(varData);
при разблокировании VarArray в Parr (память распределённая под массив 7000 байт) получаем указатель на память откуда копируем всё содержимое (одна запись BLOB DataSet) в .... куда угодно для своей работы.

Код: plaintext
1.
System.Move(Parr^[ 0 ], longSize, SizeOf(longSize)); // в перем. longSize пишем первые 4 байта с сервера.
tmpStream.Write(Parr^[ 0  + SizeOf(longSize)],longSize);// пишем всё оставшееся в класс - поток tmpStream


______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
olevariant и variant
    #33097493
tokito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ты все понимаешь правильно, да, надо бинарные данные скопировать, но не получается!!!

пишу так
Код: plaintext
1.
2.
    int *pp = new int[ 10000 ];
    (void *)pp = VarArrayLock(var);

опять эксепшн появляется, пишет Invalid Argument
...
Рейтинг: 0 / 0
olevariant и variant
    #33097636
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tokitoты все понимаешь правильно, да, надо бинарные данные скопировать, но не получается!!!

пишу так
Код: plaintext
1.
2.
    int *pp = new int[ 10000 ];
    (void *)pp = VarArrayLock(var);

опять эксепшн появляется, пишет Invalid Argument
Ну надо Сишников спросить.
2. Попробуй по частям
- самому сделать массив вариант - varArrayCreate
Код: plaintext
  (void *)pp = свойМассив
- может надо @ добавить )))))))))))))))
- ругается на какой параметр - слева или справа?
...
Рейтинг: 0 / 0
olevariant и variant
    #33097651
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё раз говорю - есть функция проверки типа твоего var. Если тип не массив, то будет ругаться. Например на сервере поле BLOB и поле
Код: plaintext
1.
[arrpnt] [image] NOT NULL ,
[properti] [Binary] ( 7000 ) NULL ,
приходит разный вариант!
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
olevariant и variant
    #33097658
tokito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
откуда ж я знаю на какой параметр ругань - это ж exception !!

вот, вот, как бы нам сишников в диалог привлечь?

в любом случае вам огромное спасибо, и за отзывчивость в том числе, редкое качество в нете!
...
Рейтинг: 0 / 0
olevariant и variant
    #33097857
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
откуда ж я знаю на какой параметр ругань - это ж exception !!========== когда формулу разобьёте на части (подставляя заведомо правильные параметры), тогда узнаете.

вот, вот, как бы нам сишников в диалог привлечь? ============ Вы и сами сможете, тока Трудится надо! И отвечать на все вопросы а не на часть из них.

в любом случае вам огромное спасибо, и за отзывчивость в том числе, редкое качество в нете! ========= не за что, просто есть ветки более живые и ответов там больше (ни в коем случае не камень в огород).
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
olevariant и variant
    #33098223
tokito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
интересно как я тебе вот эту формулу разобью на части??

Код: plaintext
1.
    (void *)pp = VarArrayLock(var);

живые темы.. гы.. весьма забавно почитать про всякую ерунду порой, но меня интересует конкретный вопрос, здесь и сейчас, решение которого "тыканьем" разных аргуметов меня не впечатляет. вы упорно закрывает глаза на то о чем я вас спрашиваю

!!! ЧТО ТАКОЕ ИНВАЛИД ДАТА ПАКЕТ !!!

для того чтобы что-то хорошо делать нужно понимать что ты делаешь! вас в школе учили вообще?
...
Рейтинг: 0 / 0
olevariant и variant
    #33099745
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторинтересно как я тебе вот эту формулу разобью на части??
вместо DataSet создать свю собственную var-массив-переменную.
ЗЫ. Без труда не выловишь рыбки из пруда.
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
olevariant и variant
    #33099750
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторменя интересует конкретный вопрос, здесь и сейчас, решение которого "тыканьем" разных аргуметов меня не впечатляет.
я заметил ). IMHO не заниматься программированием с такими заявлениями.

Удачи!
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
olevariant и variant
    #33100127
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй просто

pp = VarArrayLock(var);
...
Рейтинг: 0 / 0
olevariant и variant
    #33100214
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть я имел ввиду не запрашивай память через new a

char *pp = VarArrayLock(var);
...
Рейтинг: 0 / 0
olevariant и variant
    #33100329
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzТо есть я имел ввиду не запрашивай память через new a

char *pp = VarArrayLock(var);
конечно, думаю что память не должна быть распределена.
...
Рейтинг: 0 / 0
olevariant и variant
    #33100789
tokito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VarArrayLock тут вобще не при делах, спасибо AndreiNz но все не в кассу.
короче объективный вывод: мы все лохи.
...
Рейтинг: 0 / 0
olevariant и variant
    #33100820
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй еще следующее:

ClientDataSet1->Data = **OleVariant(v).pparray;

А вообще, большую роль играет то, как ругается компилятор, я имею ввиду дословно и на каккой комнде возникает ошибка.
...
Рейтинг: 0 / 0
olevariant и variant
    #33100828
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или еще:

ClientDataSet->Data.vt = VT_EMPTY;
hres = VariantCopy(&ClientDataSet->Data, &v);

кстати проверь, что есть ClientDataSet->Data. Если это функция, возвращающая ссылку типа:

Variant &ClientDataSet->Data(); то надо использовать скобки

ClientDataSet->Data().vt = VT_EMPTY;
hres = VariantCopy(&ClientDataSet->Data(), &v);

Если же это просто public Vararay то скобки не нужны.
...
Рейтинг: 0 / 0
olevariant и variant
    #33101975
tokito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей, на все твои предположения ругается компилятор.

У меня же ругань не компилятора, а эксепшн winmain'а в блоке

try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
...
...
Рейтинг: 0 / 0
olevariant и variant
    #33104647
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, что сама идея

ClientDataSet1->Data = v.parray;

была правильной, только ты рередешь не то в v.parray; Или указатель вместо объекта или наоборот.
...
Рейтинг: 0 / 0
olevariant и variant
    #33104733
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzЯ думаю, что сама идея

ClientDataSet1->Data = v.parray;

была правильной, только ты рередешь не то в v.parray; Или указатель вместо объекта или наоборот.
а мне кажется с такими темпами и ленью (до сих пор нет ответа на вопрос - какой тип варианта получаешь в переменной вариант) челу проще на Delphi писать.
...
Рейтинг: 0 / 0
olevariant и variant
    #33105878
tokito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да по-моему я наверху уже сказал какой тип, ооооой странный народ люди считающие себя программистами!
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / olevariant и variant
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]