Соединяю 2 строки функцией lstrcat. Первая строка берется из Edit'a, вторая объявлена как db. Потом сохраняю полученную строку в файл, просматриваю файл, а там какие-то иероглифы. Что я не так делаю? Вот кусок кода: Code (Text): .data bTest db "hello",0 .code ;... .IF ax == BN_CLICKED invoke CreateFile,ADDR bSaveFileName,GENERIC_WRITE,FILE_SHARE_READ or \ FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,0 mov hFile,eax invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE mov hMemory,eax invoke GlobalLock,hMemory mov pMemory,eax invoke SendMessage,hwndedit1,WM_GETTEXT,MEMSIZE-1,pMemory invoke lstrcat,addr pMemory,addr bTest invoke WriteFile,hFile,pMemory,eax,ADDR SizeReadWrite,NULL invoke CloseHandle,hFile invoke GlobalUnlock,pMemory invoke GlobalFree,hMemory .ENDIF Пробовал bTest db заменять на dword, все равно тот же результат - или файл пустой или иероглифы
invoke lstrcat,pMemory,addr bTest invoke lstrlen,pMemory invoke WriteFile,hFile,pMemory,eax,ADDR SizeReadWrite,NULL
Спасибо, Quantum. А как еще можно соеденить строки, чтобы получился список строк? Как в многострочном окне редактирование, например.
А если надо соединить строку с текстом, взятым из Edit? Пробовал сделать так: Code (Text): invoke lstrcat,bTest,addr bTest invoke lstrlen,bTest invoke WriteFile,hFile,bTest,eax,ADDR SizeReadWrite,NULL Но опять файл получается пустой
ну как минимум invoke lstrcat, addr bTest,addr bTest invoke lstrlen, addr bTest invoke WriteFile,hFile, addr bTest,eax,ADDR SizeReadWrite,NULL
cresta, flankerx, спасибо за подробные разъяснения, но я так все время писАл (с помощью addr или offset), но начал сомневаться, когда Quantum без addr написАл, и что самое главное - оно работало))) как узнать где надо вставлять addr а где ненадо, если даже в help'e написано "address of buffer for...". Это от типа строки зависит?
Это от типа строки зависит? Это не зависит от типа строки. Смотри, как ты пробовал: 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...........и т.д.