FoxPro и DLL (передача параметров)

Тема в разделе "WASM.WIN32", создана пользователем _NsA, 20 окт 2005.

Статус темы:
Закрыта.
  1. _NsA

    _NsA New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2005
    Сообщения:
    6
    Адрес:
    Москва
    Доброго времени суток.

    Я только начал разбираться с масмом, поэтому не пинайте сильно.

    Есть DLL ...



    TestProc proc bfBuffer:dword

    LOCAL nsa:dword

    ;invoke MessageBox,NULL,addr MbMsg,addr MbTitle,MB_OK

    invoke lnstr, ADDR bfBuffer

    mov nsa,eax

    invoke procMD5hash,addr bfBuffer,addr nsa,addr stMD5Result

    mov eax,offset stMD5Result

    ret



    TestProc endp



    Эта функция должна выдавать указатель на строку с MD5Hash

    В программе VFP пишу: ...



    DECLARE string TestProc IN Vfpdll.dll string @

    nnn="test"

    fff=TestProc(@nnn)

    CLEAR DLLS "RegCloseKey"



    ОТВЕТ: ERROR - Declare DLL call caused an exception



    Пишу:

    DECLARE string TestProc IN Vfpdll.dll integer @

    nnn="test"

    fff=TestProc(@nnn)

    CLEAR DLLS "RegCloseKey"



    ОТВЕТ: ERROR - Data type mismatch



    Подскажите в каком направлении мне копать....

    (Заранее спасибо.)
     
  2. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    @nnn это не адрес строки. Это адрес структуры, в которой хранится тип данных и реальный указатель на них. А вернее даже не структуры а юниона. В общем был такой продукт - fox lck вроде - там были сишниые хидеры и либа для написания модулей. Правда это было под досовский фокс, но изменилось с тех пор немного.
     
  3. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Для проекта на VFP (сейчас пользуем версию 9, а до этого последовательно 7 и 8) писал на masm32 v8.2 библиотеку, в которой одна функция, возвращающая часть IP-адреса компутера (первые три триады). В аттаче возьми, посмотри. У нас работает на ура.

    [​IMG] _578228004__network.rar
     
  4. _NsA

    _NsA New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2005
    Сообщения:
    6
    Адрес:
    Москва
    Спасибо буду копть.

    Накопаю выложу для пользования.
     
  5. _NsA

    _NsA New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2005
    Сообщения:
    6
    Адрес:
    Москва
    irrona

    --------------

    Спасибо сейчас буду разбираться.
     
  6. _NsA

    _NsA New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2005
    Сообщения:
    6
    Адрес:
    Москва
    Возвращение функции это замечательно.

    Оно и у меня работает, а вот передача в эту функцию параметра мне непонятна...

    ----------

    Ну ламер ламер.....
     
  7. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    _NsA

    Забыл еще. Из фокса вызов функции делается так:
    Код (Text):
    1.  
    2.     declare string GetIPPart in network.dll
    3.     ip_part=GetIPPart()
    4.     clear dlls
    5.  
     
  8. _NsA

    _NsA New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2005
    Сообщения:
    6
    Адрес:
    Москва
    Копаю в сторону того, что сказал infern0.
     
  9. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    _NsA

    Ну хорошо. Вот тебе еще пример. Библиотека имеет 2 функции, одна из которых конвертирует строку в base64, другая - обратно. Вызов из фокса следующий
    Код (Text):
    1.  
    2. instring='hello world'
    3. outstring=SPACE(100)
    4. declare long base_encode in b64.dll string @, string @
    5. =base_encode(instring,@outstring)
    6. =MESSAGEBOX(outstring,0)
    7. instring = SPACE(100)
    8. declare long base_decode in b64.dll string @, string @
    9. =base_decode(outstring,@instring)
    10. =MESSAGEBOX(instring,0)
    11. clear dlls
    12.  




    Код функций библиотеки от Quantum



    [​IMG] _1623904402__b64.rar
     
  10. _NsA

    _NsA New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2005
    Сообщения:
    6
    Адрес:
    Москва
    ВСЁ ---

    Разобрался.

    Я обрабатывал передаваемые параметры в библиотеке как

    значение, то есть брал адрес адреса.

    А нужно было обрабатывать как ссылку на строку.



    В итоге:

    DLL



    invoke lstrcpy,addr bfBuffer,txtBuffer

    invoke lnstr, addr bfBuffer

    .if eax < MAX_INPUTSTRING

    invoke procMD5hash,addr bfBuffer,eax,addr stMD5Result

    mov eax,offset bfBuffer

    .ELSE

    szText LmTitle,"VFPDLL.DLL (Exception)"

    szText LmText,"Превышение максимального значения ."

    invoke MessageBox,NULL,addr LmText,addr LmTitle,MB_OK

    mov eax,offset txtERROR

    .endif

    ret



    Вызов:



    DECLARE string CalcSummMD5String IN Vfpdll.dll string @



    instring="test"

    ttt=CalcSummMD5String(instring)

    =MESSAGEBOX(ttt,0)



    CLEAR DLLS "CalcSummMD5String"



    ВСЕМ СПАСИБО...
     
Статус темы:
Закрыта.