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

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

lmed

#1
Добрый день, уважаемые форумчане. Помогите, пжл, разобраться в ситуации:
есть простенькая функция в 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

Чёрный маг
Lotus team
06.11.2007
3 231
17
#2
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

#3
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

#4
В Лотусе если писать так:
Код:
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:
Он сам определяет чем ему быть - строкой, числом, объектом... и ещё штук 15 вариантов.
В Лотусе это почти всегда массив из varDouble, varDate или varOleStr.
Например, вот тут
Код:
Dim v As Variant
v = 300
Получается Variant-массив из одного значения типа varDouble.

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

lmed

#5
Меня как раз устраивает если в функцию будет передаваться указатель.
Соответственно на 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 - неизвестный тип.