• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Передача Variant Из Lotusscript В Dll

  • Автор темы lmed
  • Дата начала
L

lmed

Добрый день, уважаемые форумчане. Помогите, пжл, разобраться в ситуации:
есть простенькая функция в DLL (на с++)
C++:
long __stdcall SendVar( VARIANT* v) 
{
return v->lVal;
}
По логике, должна возвращать значение, переданное в параметре.
Подключаю и запускаю эту функцию в action на ls
Код:
Declare Function SendVar Lib "c:\cvv.dll" ( v As Variant) As Long
Sub Click(Source As Button)
Dim k As Long
Dim v As Variant

v = 300	
k = SendVar(v)	
Messagebox(Cstr(k))		
End Sub

Функция упорно возвращает - 2. При отладке на с++ видно, что передаваемое из LS значение (в данном случае 300) помещается в поле типа (vt) а не в поля данных.

Собственно вопрос, а почему так происходит? Есть корректный способ передачи Variant из LS в dll?
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Declare Function SendVar Lib "c:\cvv.dll" (b v As string) As Long
Declare Function SendVar Lib "c:\cvv.dll" (byval v As Variant) As Long
попробуй одну из

а что на с++ появился тип VARIANT? - это что за тип такой
 
L

lmed

Declare Function SendVar Lib "c:\cvv.dll" (b v As string) As Long
Declare Function SendVar Lib "c:\cvv.dll" (byval v As Variant) As Long
попробуй одну из

а что на с++ появился тип VARIANT? - это что за тип такой

Что значит "появился"? Он уже давным давно есть :lol: Как раз и предназначен для взаимодействия с VB..


Если объявить
Declare Function SendVar Lib "c:\cvv.dll" (byval v As Variant) As Long

при вышеуказанном прототипе в DLL, то lotus вылетает.

Если поправить в dll
C++:
long __stdcall SendVar( VARIANT v)
То отрабатывает нормально, только возвращает 32770. При этом пересылаемое значение (300) по преднему попадает в поле типа (vt) но никак не в поля с данными..
 
F

FixeR

В Лотусе если писать так:
Код:
Declare Function SendVar Lib "c:\cvv.dll" (byval v As Variant) As Long
То будет передаваться значение v.

А сли так:
Код:
Declare Function SendVar Lib "c:\cvv.dll" (v As Variant) As Long
То будет передаваться указатель на v.
Учтите это в коде библиотеки.

Variant - опасный тип :lol:
Он сам определяет чем ему быть - строкой, числом, объектом... .
В Лотусе это почти всегда массив из varDouble, varDate или varOleStr.
Например, вот тут
Код:
Dim v As Variant
v = 300
Получается Variant-массив из одного значения типа varDouble.

C++:
return v->lVal;
Я не уверен, что это, но совсем не похоже на то, чтобы оно возвращало значение первого элемента из variant-массива.
 
L

lmed

Меня как раз устраивает если в функцию будет передаваться указатель.
Соответственно на LS

Declare Function SendVar Lib "c:\cvv.dll" (v As Variant) As Long

а в dll
long __stdcall SendVar( VARIANT* v)

Понятно что хитрый тип, поэтому и вожусь с ним :lol:

Код на Ls передает внутрь не массив, а одно значение типа Long, для наглядности можно сделать явно, вот так:

Код:
Dim k As Long
Dim v As Variant

k = 300
v = k
k = SendVar(v)
В таком случае, Переменная vt внутри варианта (на с++) должна быть VT_I4 (тип long), но вместо этого в ней оказывается значение 300 - неизвестный тип.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!