Доброго времени суток. Я только начал разбираться с масмом, поэтому не пинайте сильно. Есть 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 Подскажите в каком направлении мне копать.... (Заранее спасибо.)
@nnn это не адрес строки. Это адрес структуры, в которой хранится тип данных и реальный указатель на них. А вернее даже не структуры а юниона. В общем был такой продукт - fox lck вроде - там были сишниые хидеры и либа для написания модулей. Правда это было под досовский фокс, но изменилось с тех пор немного.
Для проекта на VFP (сейчас пользуем версию 9, а до этого последовательно 7 и 8) писал на masm32 v8.2 библиотеку, в которой одна функция, возвращающая часть IP-адреса компутера (первые три триады). В аттаче возьми, посмотри. У нас работает на ура. _578228004__network.rar
Возвращение функции это замечательно. Оно и у меня работает, а вот передача в эту функцию параметра мне непонятна... ---------- Ну ламер ламер.....
_NsA Забыл еще. Из фокса вызов функции делается так: Код (Text): declare string GetIPPart in network.dll ip_part=GetIPPart() clear dlls
_NsA Ну хорошо. Вот тебе еще пример. Библиотека имеет 2 функции, одна из которых конвертирует строку в base64, другая - обратно. Вызов из фокса следующий Код (Text): instring='hello world' outstring=SPACE(100) declare long base_encode in b64.dll string @, string @ =base_encode(instring,@outstring) =MESSAGEBOX(outstring,0) instring = SPACE(100) declare long base_decode in b64.dll string @, string @ =base_decode(outstring,@instring) =MESSAGEBOX(instring,0) clear dlls Код функций библиотеки от Quantum _1623904402__b64.rar
ВСЁ --- Разобрался. Я обрабатывал передаваемые параметры в библиотеке как значение, то есть брал адрес адреса. А нужно было обрабатывать как ссылку на строку. В итоге: 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" ВСЕМ СПАСИБО...