Работа с Variant на низком уровне

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Работа с Variant на низком уровне

Сообщение jangle » 22.01.2016 (Пт) 19:57

The trick писал(а): можно сделать просто OBJ и линковать его ко всем проектам.


ага, положить ее в папку VB и чтобы она автоматически ко всем проектам линковалась. Вот такой новый рантайм :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Работа с Variant на низком уровне

Сообщение Хакер » 22.01.2016 (Пт) 19:58

jangle писал(а):Может MSVBVM60 свою напишут, где не будет GetMem или они будут работать по-другому.

С тем же успехом стоит рассматривать версию о том, что напишут свою MSVBVM60, где не будет MsgBox или не будет любой другой экспортируемой функцию, от которой зависел старый код.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Работа с Variant на низком уровне

Сообщение The trick » 22.01.2016 (Пт) 20:11

jangle писал(а):ага, положить ее в папку VB и чтобы она автоматически ко всем проектам линковалась. Вот такой новый рантайм :)

Да можно сделать и новый рантайм и запихнуть все это дело через референсы как tlb, а при компиляции править COFF файл и линковать свою OBJ. Можно даже попробовать P-Code модифицировать (это даже более правильней), у меня даже была такая идея добавить новых команд туда, типа сдвигов и доступа к памяти. Информация по P-опкодам очень скудная.
Нужно просто хорошенько продумать как сделать удобнее в плане использования, чтобы можно было и линковать функции и заменять рантаймовские при необходимости. В любом случае при статической линковке придется делать прототипы.
UA6527P

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Работа с Variant на низком уровне

Сообщение jangle » 23.01.2016 (Сб) 1:15

В общем я хотел реализовать на VB примерно это:
Код: Выделить всё
Sub AddVariant Alias "AddVariant" (ByVal v1  As tag_inner_PROPVARIANT Ptr,_
                                   ByVal v2  As tag_inner_PROPVARIANT Ptr,_
                                   ByVal res As tag_inner_PROPVARIANT Ptr  ) Export

       Select Case As Const @v1.vt
            Case %VT_UI1:@res.vt=%VT_UI1: @res.bVal=@v1.bVal + @v2.bVal      :Exit Sub
            Case %VT_I2 :@res.vt=%VT_I2:  @res.iVal=@v1.iVal + @v2.iVal      :Exit Sub
            Case %VT_I4 :@res.vt=%VT_I4:  @res.lVal=@v1.lVal + @v2.lVal      :Exit Sub
            Case %VT_R4 :@res.vt=%VT_R4:  @res.fltVal=@v1.fltVal + @v2.fltVal:Exit Sub
            Case %VT_Cy :@res.vt=%VT_Cy:  @res.cyVal=@v1.cyVal + @v2.cyVal   :Exit Sub
            Case %VT_R8 :@res.vt=%VT_R8:  @res.dblVal=@v1.dblVal + @v2.dblVal:Exit Sub
       End Select
End Sub
         

Выигрыш по сравнению с обычным сложением вариантов огромен. Конечно мало кто выполняет математические операции с типом Variant (кроме скриптовых языков) но в моем случае это как раз нужно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Работа с Variant на низком уровне

Сообщение Хакер » 23.01.2016 (Сб) 5:35

jangle писал(а):В общем я хотел реализовать на VB примерно это:

А с чего ты решил, что так вообще делать — легитимно?
Откуда гарантия, что v2.vt равно v1.vt?

По умолчанию такой гарантии нет. С учётом этого, проверять нужно оба vt, а потом приводить их к какому-то общему типу.
И, в общем-то, именно так и происходит, когда __vbaVarAdd вызывает VarAdd из OLEAUT32.

jangle писал(а):Выигрыш по сравнению с обычным сложением вариантов огромен.

Давай-ка бенчмарк какой-нибудь сюда выложи, чтобы разговор был предметным.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Работа с Variant на низком уровне

Сообщение The trick » 23.01.2016 (Сб) 11:38

Еще нужно переполнения учитывать:
Код: Выделить всё
Dim v1 As Variant, v2 As Variant

v1 = CByte(255)
v2 = CByte(1)

v1 = v1 + v2

Здесь v1 после сложения будет иметь тип Integer.
UA6527P

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Работа с Variant на низком уровне

Сообщение jangle » 24.01.2016 (Вс) 12:19

Хакер писал(а):Давай-ка бенчмарк какой-нибудь сюда выложи, чтобы разговор был предметным.


на VB бенчмарка нет

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList