Здрасте.у меня будет два вопроса. 1)по нажатию кнопки у меня должен текст из edit контрола записываться в файл,вот как я делаю Code: .IF ax==ButtonID shr eax,16 .IF ax==BN_CLICKED invoke GetWindowText,hwndEdit,ADDR buffer,512 invoke WriteFile,hFile,addr buffer,512,addr htemp,0 .ENDIF но файл так и остается пуст.подскажите что не так,или может как по другому можно текст из edit записать в файл по нажатию кнопки(код определения нажатия кнопки вроде ж правильный) и 2) допустим в opendialog я выбрал какой либо файл,как записать путь к нему в edit?
1) С каким режимом доступа открывали файл ( GENERIC_READ,GENERIC_WRITE )? 2) В структуре OPENFILENAME, lpstrFile является указателем на буфер, который содержит имя файла. invoke SendMessage,hWndControl,WM_SETTEXT,0,OPENFILENAME.lpstrFile
1. Покажи как ты объявляешь buffer. 2. Проверь содержимое buffer после GetWindowText. 3. Проверь, чему равна htemp после WriteFile. Да и вообще, по отрывку кода из программы что-то советовать - это как пальцем в небо. Порой бывает и во всем коде разобраться не можешь. Учись пользоваться ollydbg. Хорошо владеющий отладчиком программист, почти никогда не задает вопросов такого типа.
буфер обьявляю так buffer db 512 dup(?) насчет оли это да,может посоветуешь что почитать?а то я как то так все вручную да вручную... насчет куска кода:просто это и есть самая важная часть,все остальное это создание окна и контролов.
Ну тогда вот эти данные выложи: Почитать? Рикардо Нарваха, цикл статей "Введение в крэкинг с нуля, используя OllyDbg". Там не то, что бы по полочкам расписано, там как для людей, которые еще не умеют толком работать в Windows, но уже хотят уметь отлаживать программы
всмысле?как?вобще в msgbox-e выдается тот текст что я ввожу,а в файл чето не пишется.нащет статей это на wasm прямиком?
капец,я тупанул....все нашел,разобрался,спасибо за чтиво,а тогда еще вопрос,заранее кол-во символов в edite неизвестно,как определить скоко записывать? так :bufff dd $-buf ?
Записывать в смысле считывать в буфер? Мм, думаю никак. Делаешь буфера приблизительно с запасом, и считываешь туда. Отвыкай от динамических безразмерных массивов высокоуровневых ЯП если честно, я даже представить не могу что из этого получиться По идее у тебя в bufff вообще окажется какое-то смещение. $ (текущий адрес) - buf (адрес метки), в итоге получишь просто смещение метки buf относительно адреса переменной bufff. По идее. Хотя я могу ошибаться. Я такими записями редко пользуюсь и только в одном случае - подсчета размера каких либо данных: buff1 db 1,2,3,4,5,6,7 buff2 equ $-buff1
та да,на высокоуровневых языках с этим полегче записывать файл,к примеру сделать буфер размером 512 байт, и записать всего 3-4 символа,то 508-509 байт запишутся как пустота.вот я имел ввиду как етого избежать.
Кстати, по поводу буфера считывание...Можно пользоваться стеком Тогда не нужно будет выделять под буфер память, и соответственно программа будет меньше занимать места, а так же не нужно мудрить с размером буфера. Только с этим делом нужно очень аккуратно быть, а то существует очень замечательная уязвимость "Stack overflow".
Нет, ты что пушать, это же с ума сойти можно. Например ты читаешь 512 байт из файла. Ты хочешь что бы данные содержались в стеке. Адрес буфера вычисляешь по формуле: Code: <Текущий адрес стека> - <512> = <адрес буфера> Почему отнимаем 512? Потому что стек растет сверху вниз, и когда в него будет происходит записать при помощи ReadFile допустим, то данные будут забиваться снизу вверх. Таким образом мы "резервируем" в стеке 512 байт под наши данные, и всё делаем аккуратненько ничего не затирая. Code: +-------------------------+ 1000h | Текущее положение стека | +-------------------------+ | | | 512 байт под буфер | | | +-------------------------+ 488h | Адрес буфера | +-------------------------+ Вот тебе небольшой пример. Но я не стал читать из файла, просто переписал данные, заранее забитые в буфер, расположенный в секции данных, в стек. Главное понять принцип, дальше работу с файлами освоишь сам. Code: .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .data buff db 1,2,3,4,5,6,7,8,9 db 1,2,3,4,5,6,7,8,9 db 1,2,3,4,5,6,7,8,9 db 1,2,3,4,5,6,7,8,9 buff_size equ $-buff .code start: mov esi,offset buff mov edi,esp sub edi,buff_size mov ecx,buff_size rep movsb push 0 call ExitProcess end start Увидеть результат можно только под отладчиком. Если ты заглянешь в стек, то увидишь там buff.