Передача данных в VB

Тема в разделе "WASM.BEGINNERS", создана пользователем OFFSIDE, 23 сен 2006.

  1. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    Бред, но раз тебе приятно так думать, i don't mind.

    а речь о лишних движениях, или таки о строках?

    Ну да ладно, вопрос о строках мы уже выяснили, остальное уже не так интересно :)
     
  2. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Весело тут у вас.
    Вот пример кода длл-ки:

    StrCrt proc stroka:dword
    mov subtr,remove$(stroka," ")
    mov eax,subtr
    ret
    StrCrt endp

    Возращает <b>строку</b>!!!
    Но - размер строки не равен результирующей длине строки, возращает результат, нулевой байт(как признак конца строки) и "остаток" - длина строки на выходе равна длине строки на входе. Как быть?
     
  3. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    А вот и рабочая функция:

    Declare Function StrCrt(ByVal stroka as String) as String

    Private Sub Form_Load
    Dim d as String
    d=StrCrt("бла бла бла")
    Me.AutoRedraw = True
    Me.Print d
    End Sub

    возращает блаблабла и hex 00h32h32 и бла :)
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    :)
     
  5. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    IceStudent

    Весьма информативно.

    Код от 23:04:19 - Это VB.
    :)
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    OFFSIDE

    ведь уже всё в мельчайших подробностях разжевано:

    Код (Text):
    1. ;получаем длину результирующей строки
    2. invoke  lstrlen, subtr
    3. ;создаём 'каркас' строки для возвращения в VB                          
    4. invoke  SysAllocStringByteLen, NULL, eax
    5. ;заполняем 'каркас' строкой, которую нужно вернуть
    6. invoke  lstrcpy, eax, subtr
    7. ;возвращаем строку
    8. ret
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Блин, а где делась ссылка редактирования?

    После invoke SysAllocStringByteLen, NULL, eax вставь push eax, а перед ret - pop eax
     
  8. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    cresta

    Большое спасибо, еще вопросик можно?

    А если не делать push и pop, ведь ничего не измениться, правильно?
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Улыбнуло русское слово кириллицей.

    В данном случае - нет, т.к. lstrcpy возвращает указатель на буфер, то есть, 1 аргумент.
     
  10. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    И еще, есть ли ограничение на размер входящей строки (про 4 Гб не надо) ???
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    в описании SysAllocStringByteLen ничего об ограничении не сказано.
     
  12. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    cresta

    В твоем примере:
    Код (Text):
    1. SomeFunc proc uses ebx esi edi lpInput1:DWORD, lpInput2:DWORD
    2.     invoke  lstrlen,lpInput1
    3.     mov     ebx,eax
    4.     invoke  lstrlen,lpInput2
    5.     mov     esi,eax
    6.     lea     ecx,[ebx+eax+1]
    7.     invoke  SysAllocStringByteLen, NULL, ecx
    8.     mov     edi,eax
    9.     invoke  lstrcpy, edi, lpInput1
    10.     mov     byte ptr[edi+ebx],32
    11.     invoke  lstrcat,edi,lpInput2
    12.     mov     eax,edi
    13.     ret
    14. SomeFunc endp
    Объясни плиз
    lea ecx,[ebx+eax+1] - это длина строки?
    invoke SysAllocStringByteLen, NULL, ecx
    mov edi,eax
    eax - это указатель?
     
  13. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    и еще:
    mov byte ptr[edi+ebx],32
    edi - адрес, ebx - смещение?
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    в ebx длина первой строки, в eax - длина второй строки, 1 - длина пробела между строками. В сумме получается длина буфера, который надо выделить под две входные строки и пробел между ними.

    совершенно верно, edi - адрес выходной строки (той, которая формируется), ebx - смещение от её начала, равное длине первой входной строки. На этом смещении от начала вставляется пробел (его код - 32)
    замени byte ptr на word ptr (это опечатка).
     
  15. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    cresta

    С word понятно, работает!!!
    А если не использовать ОЛЕ? Как тогда можно сформировать строку?
     
  16. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    OFFSIDE
    Откуда мне знать, что делает этот макрос и делает ли он это правильно?

    Sub ничего не возвращает, на то он и Sub. Ваши фразы вообще понять невозможно или я один туплю.
     
  17. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Quantum

    Возвращает переменная, в примере d...
    То есть код при загрузке основного окна формы выводит на себя содержимое переменной, полученной в результате обработки. Выглядит блаблабла и hex 00h32h32 и бла :). А что делает макрос, я не понимаю. Пытаюсь найти его в windows.inc
     
  18. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    remove$ MACRO src,substr
    invoke szRemove,reparg(src),reparg(src),reparg(substr)
    EXITM <eax>
    ENDM
     
  19. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    А что такое reparg?
     
  20. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    OFFSIDE
    Но всё равно решили его использовать, в надежде, что компилятор всё разрулит. Это же не VB!!!

    Ещё один макрос.

    Вообще, лучше забыть о макросах и сделать всё на чистом ассемблере для начала.