кто-нибудь смог довести его до ума? нашёл несколько ... странностей : LOCAL buffer[1024*10]:BYTE - этот фокус не проходит... и вообще - обработчик сабклассированного РичЭдита какой-то не такой : NewRichEditProc proc hWndWORD, uMsgWORD, wParamWORD, lParamWORD и дальше пошли - invoke SendMessage,hWnd,EM_LINEFROMCHAR,eax,0 invoke SendMessage,hWnd,EM_LINEINDEX,eax,0 и так далее ... не может этого быть ... может гуру смогут ненадолго отвлечься от перехватов и взглядов изнутри ? и помочь начинающему перспективному российскому програмисту - и значит всем начинающим, которые есть и ещё долго будут начинать...
http://win32assembly.online.fr/tut35.html тут полный код Что вам тут не нравится? Главное не забыть слинковать с опцией /STACK:2000000,2000000 Все тут верно WinProcCallBack прототип схож с мсдн-овским hWnd как раз того ричэдита, который сабклассируют. Больше конкретики. Что у вас не выходит?
может деёствительно - зависит от опций компиляции? я всё делаю в Масм Билдере, там : /v rsrc.rc /machine:ix86 rsrc.res /c /coff %1.asm /SUBSYSTEM:WINDOWS %1.obj rsrc.obj и всегда было ок... дальше : программа падает от WordFileName db "\wordfile.txt",0 ,нужно вроде просто "wordfile.txt",0 LOCAL buffer[1024*10]:BYTE - компилируется, но в этом месте программа опять падает.. короче, нивкакую к ту же я встроил ричэдит в другую программу, и он занимает не всю клиентскую область да и - hWnd - глобальная переменная, хэндл главного окна, так что пришлось NewRichEditProc переделать... Но это всё неважно.. все исходники уроков ( почти) компилируются, 35-й - НЕТ, это не может быть нормальным явлением, все попытки выяснить - почему, упираются либо в молчание либо ... ладно... спасибо за участие ...тема закрыта ...надоело..
driver А чего сразу закрывать, давайте спокойно разберемся. 1) по поводу компиляции Беру код из той ссылки, что давал выше. Открываю радасм. Делаю проект. Копирую код и файл рессурсов. Компиляция самая дефолтная ML.EXE /c /coff /Cp /nologo /I"$I У линкера опции следующие LINK.EXE /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"$L" Далее НЕЗАБЫВАЕМ в линкере указать Код (Text): /STACK:2000000,2000000 Как я и писал. В радасме я не смог его добавить (ему не нравится запятая, а по другому так и не въехал), так что линковал через *.bat файл. Проект собрался. \wordfile.txt так и оставляется. Почему? Да потому, что если вы читали исходник, то там вначале вызывается GetModuleFileName, потом после нехитрых действий, выполняется invoke lstrcat,addr buffer,addr WordFileName И без черточки слева, вы получите "ИМЯдиректорииФАЙЛ.тхт" А теперь про падения. 1) падает на WordFileName говорите? В каком месте? А отладить? Я думаю вы с оллидебаг знакомы. 2) LOCAL buffer[1024*10]:BYTE - компилируется, но в этом месте программа опять падает.. Это место решается указанием размера стека в линкере. Читайте внимательнее. Покажите где в исходнике hWnd глобальная? Ладно я щас тупо скопирую .data? Код (Text): hInstance dd ? hRichEdit dd ? hwndRichEdit dd ? FileName db 256 dup(?) AlternateFileName db 256 dup(?) CustomColors dd 16 dup(?) FindBuffer db 256 dup(?) ReplaceBuffer db 256 dup(?) uFlags dd ? findtext FINDTEXTEX <> ASMSyntaxArray dd 256 dup(?) hSearch dd ? ; handle to the search/replace dialog box hAccel dd ? hMainHeap dd ? ; heap handle OldWndProc dd ? RichEditVersion dd ? В упор не вижу hWnd в глобале. А теперь по поводу "молчания либо ...". Если вам советуют, извольте прочитать внимательно и вдуматься. Неужели трудно открыть ссылку, взять оттуда код, скопировать. Собрать учитывая опции линкера, создать файл wordfile.txt, напихать туда данных, как это делал ICZELION и дальше проверить.
в проге, куда я вставил ричэдит, hWnd - хэндл окна, это я переделал - изменил хэндл в обработчике /STACK:2000000,2000000 - тут виноват, не имею представления куда это вставлять, не было такой надобности Сделал пока LOCAL buffer[4088]:BYTE , при меньших значения буфер переполняется при скроллинге... Дошёл до того. что комментирии - зелёные, всё остальное как было, щас ещё поразбираюсь немножко...
driver Код (Text): /STACK:2000000,2000000 - тут виноват, не имею представления куда это вставлять, не было такой надобности Еще раз повторюсь. В опции линкера. тогда не будет проблемы с LOCAL buffer[1024*10]:BYTE и переполнениями. В общем я дал пошаговое указание что делать. Вот пробуйте.
lstrcat,addr buffer,addr WordFileName, да , но перед этим - mov al,"\" если WordFileName db "\wordfile.txt",0 программа умрёт не успев пикнуть подсвечиваются только комментраии, где-то ошибка Я НЕ ВЕРЮ, что исходник на сайте и по ссылке - компилируется и исполняемый файл работает нормально... НЕ ВЕРЮ ... при всём уважении и так далее...
Сделаем проще, я прикладываю Свой так сказать прожект Там асм, rc , оbj, exe, txt файлы. Еще прикрепил link.bat Вам останется тока пути поменять к инклюдам и либам (в bat файле тоже к либам изменяем путь) Можете даже сравнить посимвольно asm файлы.
ещё один вопрос - какие опции и куда нужно вставить, что бы компиоятор и линкер забили на тот факт, что у некоторых ( разных) сообщений одинаковые числовые эквиваленты? у меня меню просто йок, без объяснения причин... сейчас начну учиться компилить с помощью батника, чего раньше никогда не делал по причине отсутствия необходимости...
Пример в студию, такого кода, который у вас не работает. И вообще поподробнее. С этого нужно было начинать изучение ассемблера да и вообще компьютера. А то привыкли мышку юзать, интерфейсы всякие графические...