Соединение двух строк

Тема в разделе "WASM.BEGINNERS", создана пользователем ActioN, 17 июн 2005.

  1. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Соединяю 2 строки функцией lstrcat. Первая строка берется из Edit'a, вторая объявлена как

    db. Потом сохраняю полученную строку в файл, просматриваю файл, а там какие-то иероглифы.

    Что я не так делаю? Вот кусок кода:


    Код (Text):
    1. .data
    2. bTest db "hello",0
    3. .code
    4. ;...
    5. .IF ax == BN_CLICKED
    6.   invoke CreateFile,ADDR bSaveFileName,GENERIC_WRITE,FILE_SHARE_READ or \
    7.          FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,0
    8.   mov    hFile,eax
    9.   invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE
    10.   mov    hMemory,eax
    11.   invoke GlobalLock,hMemory
    12.   mov    pMemory,eax
    13.   invoke SendMessage,hwndedit1,WM_GETTEXT,MEMSIZE-1,pMemory
    14.   invoke lstrcat,addr pMemory,addr bTest
    15.   invoke WriteFile,hFile,pMemory,eax,ADDR SizeReadWrite,NULL
    16.   invoke CloseHandle,hFile
    17.   invoke GlobalUnlock,pMemory
    18.   invoke GlobalFree,hMemory
    19. .ENDIF


    Пробовал bTest db заменять на dword, все равно тот же результат - или файл пустой или иероглифы
     
  2. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    invoke lstrcat,pMemory,addr bTest

    invoke lstrlen,pMemory

    invoke WriteFile,hFile,pMemory,eax,ADDR SizeReadWrite,NULL
     
  3. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Спасибо, Quantum.

    А как еще можно соеденить строки, чтобы получился список строк? Как в многострочном окне редактирование, например.
     
  4. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    А если надо соединить строку с текстом, взятым из Edit? Пробовал сделать так:


    Код (Text):
    1. invoke  lstrcat,bTest,addr bTest
    2. invoke  lstrlen,bTest
    3. invoke  WriteFile,hFile,bTest,eax,ADDR SizeReadWrite,NULL




    Но опять файл получается пустой
     
  5. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    ну как минимум

    invoke lstrcat, addr bTest,addr bTest

    invoke lstrlen, addr bTest

    invoke WriteFile,hFile, addr bTest,eax,ADDR SizeReadWrite,NULL
     
  6. cresta

    cresta Active Member

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



    invoke lstrcat <адрес строки 1>, <адрес строки 2>
     
  7. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    cresta, flankerx, спасибо за подробные разъяснения, но я так все время писАл (с помощью addr или offset), но начал сомневаться, когда Quantum без addr написАл, и что самое главное - оно работало))) как узнать где надо вставлять addr а где ненадо, если даже в help'e написано "address of buffer for...". Это от типа строки зависит?
     
  8. cresta

    cresta Active Member

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

    Это не зависит от типа строки.



    Смотри, как ты пробовал:

    1. Первый способ - который в вопросе

    invoke lstrcat,addr pMemory,addr bTest

    здесь pMemory - адрес буфера, который получен от GlobalLock. Нужно передавать именно адрес буфера, т.е. само значение pMemory.

    А ты передавал адрес ячейки, в которой хранится значение pMemory.

    С bTest правильно: addr bTest - это адрес буфера bTest, его начало.

    Поэтому Quantum поправил:

    invoke lstrcat,pMemory,addr bTest.

    Здесь pMemory - адрес буфера, куда будет добавляться, addr bTest - адрес буфера, откуда будет добавляться.

    Т.е. pMemory и addr bTest имеют одинаковый смысл - это оба адреса.



    2. Второй способ -

    invoke lstrcat,bTest,addr bTest

    Тут тебя сбило с толку отсутствие addr в первой подсказке Quantum'а, и ты убрал addr оттуда, где он должен был быть :). И получается, что вместо двух адресов, которые ждёт функция, ты передал первым значением не адрес буфера, а первый дворд, который записан в этом буфере. Второй параметр был передан верно.



    Надо передавать два адреса:

    invoke lstrcat, addr bTest,addr bTest.



    Короче говоря, если у тебя есть буфер в секции .data, то его адрес нужно передавать так: addr my_buffer.

    Если у тебя есть буфер, который получен от функций типа Global/Local/VirtualAlloc, то они возвращают сам адрес буфера. И нужно передавать именно его: pMemory, а не адрес ячейки, где ты сохранил pMemory.

    Если надо передать адрес буфера, который на стеке, то аналогично тому, который в секции .data, т.е. с addr:

    LOCAL buffer[256] :BYTE



    invoke lstrcat, addr buffer...........и т.д.
     
  9. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Спасибо, cresta, хорошие и объяснил