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

Тема в разделе "Lotus - Программирование", создана пользователем lmed, 1 апр 2012.

  1. lmed

    lmed Гость

    Добрый день, уважаемые форумчане. Помогите, пжл, разобраться в ситуации:
    есть простенькая функция в DLL (на с++)
    Код (C++):
    long __stdcall SendVar( VARIANT* v)
    {
    return v->lVal;
    }
    По логике, должна возвращать значение, переданное в параметре.
    Подключаю и запускаю эту функцию в action на ls
    Код (LotusScript):
    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?
     
  2. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    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? - это что за тип такой
     
  3. lmed

    lmed Гость

    Что значит "появился"? Он уже давным давно есть :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) но никак не в поля с данными..
     
  4. FixeR

    FixeR Гость

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

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

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

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

    lmed Гость

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

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

    а в dll
    long __stdcall SendVar( VARIANT* v)

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

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

    Код (LotusScript):
    Dim k As Long
    Dim v As Variant

    k = 300
    v = k
    k = SendVar(v)
    В таком случае, Переменная vt внутри варианта (на с++) должна быть VT_I4 (тип long), но вместо этого в ней оказывается значение 300 - неизвестный тип.
     
Загрузка...
Похожие Темы - Передача Variant Из
  1. AvasKvas
    Ответов:
    1
    Просмотров:
    5.101
  2. Corexis
    Ответов:
    0
    Просмотров:
    71
  3. Shouldercannon
    Ответов:
    0
    Просмотров:
    488
  4. Shouldercannon
    Ответов:
    0
    Просмотров:
    388
  5. 123456789igor
    Ответов:
    0
    Просмотров:
    808

Поделиться этой страницей