Ребят,нужна помощь есть прога маленькая,написана походу на делфи 7,исходников нет, Вводишь данные,она производит расчет и выводит отчет,надо убрать некоторые формы для ввода данных,которые используются только в отчете.возможно?пробовал через де де,я не понимаю нихрена в этом,что менять и как кто может помочь стукните в асю
задача есть бинарный файл(200кб), в его теле 1 раз (смещение заранее не известно) содержится последовательность из заранее заданных 5 байт. Требуется заменить эти 5 байт на другие заранее заданные 5 байт, сохранив все остальное, в.т.ч. и название файла. (если более точно, то требуется заменить CD 16 0F 85 09 на CD 16 90 90 90 в одном системном файле) вопрос в том как сделать это с минимумом камасутры, за ответы спс побайтово читать и сохраняя буффер из последних 5 символов писать новый файл, а затем удалить оригинал и на его место записать "новый" - в голову пришло. Но как-то это тупо... кто-нибудь знает менее нерациональные способы?
Code: program Project1; {$APPTYPE CONSOLE} uses windows; var FHWND:HWND; OFS: OFSTRUCT; buf:array [1..6] of byte; tmpDW:DWORD; i, fsize:integer; const sMask:array [1..6] of byte=($CD, $16, $0F, $85, $09, $00); rMask:array [1..6] of byte=($CD, $16, $90, $90, $90, $00); begin FHWND:= OpenFile('Relase.exe', OFS, OF_READWRITE); if FHWND = INVALID_HANDLE_VALUE then Exit; fsize:=GetFileSize(FHWND,@tmpDW); for I:=1 to fsize-5 do begin ReadFile(FHWND, buf, 5, tmpDW, nil); if lstrcmp(@buf,@sMask)=0 then begin SetFilePointer(FHWND, -5, nil, FILE_CURRENT); WriteFile(FHWND, rMask, 5, tmpDW, nil); Exit; end; SetFilePointer(FHWND, i, nil, FILE_BEGIN); end; CloseHandle(FHWND); end. з.ы.: в итерации ошибка скорее всего =)
т.к. файл не большой, то проще былобы замаппить его в оперативу с правами на запись. Сразу память просканить на наличие данной сигнатуры, затем сразу изменить значение в памяти и отмаппить файл. Скорость бы была напорядок выше.
для тех кто не умеет юзать файл маппинг вот пример: Code: program Project2; {$APPTYPE CONSOLE} uses Windows; const find_data : array [0..4] of byte = ($CD, $16, $0F, $85, $09); replace_data : array [0..4] of byte = ($CD, $16, $90, $90, $90); // выдрал sysutils function CompareMem(P1, P2: Pointer; Length: Integer): Boolean; assembler; asm PUSH ESI PUSH EDI MOV ESI,P1 MOV EDI,P2 MOV EDX,ECX XOR EAX,EAX AND EDX,3 SAR ECX,2 JS @@1 // Negative Length implies identity. REPE CMPSD JNE @@2 MOV ECX,EDX REPE CMPSB JNE @@2 @@1: INC EAX @@2: POP EDI POP ESI end; var hFile : THANDLE; hFileMap : THANDLE; Mem : pointer; FileSize : dword; x : dword; begin hFile := CreateFileA('c:\Relase.exe', GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hFile <> INVALID_HANDLE_VALUE then begin FileSize := GetFileSize(hFile, nil); hFileMap := CreateFileMappingA(hFile, nil, PAGE_READWRITE , 0, FileSize, nil); if hFileMap <> INVALID_HANDLE_VALUE then begin Mem := MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, FileSize); if Mem <> nil then begin for x := 0 to FileSize - 6 do begin if CompareMem(pointer(dword(Mem) + x), @find_data[0], 5) then begin CopyMemory(pointer(dword(Mem) + x), @replace_data[0], 5); break; end; end; UnmapViewOfFile(Mem); end; CloseHandle(hFileMap); end; CloseHandle(hFile); end; end. Такими методом можно очень быстро найти данные любой длинные и также быстро заменить их. Хотя вместо CompareMem можно было просто проверить 4 байта, а потом 1 байт и это было бы быстрее при небольшом размере проверяемых данных. т.е. примерно так проверять Code: if (dword(pointer(dword(Mem) + x)^) = dword(pointer(@find_data[0])^)) and (byte(pointer(dword(Mem) + x + 4)^) = find_data[4]) then И теперь главное. если таким методом патчить виндовые проги (незапущенные) то вл:егкую обходится WFP защита. Я так патчил эксплорер. Когда его прибиваеш, патчиш, и потом опять запускаеш, то на Win XP WFP молчал.
Если тебе надо для теста, а не для написания сложных программ, то можешь юзать Indy. Это встроенный компоннент Delphi. WinSock, конечно, лучше, но его используй потом - когда освоишь азы протокола
Прога должна отправлять собщение на ICQ. Но не отправляет, почему??? procedure TForm1.Button1Click(Sender: TObject); begin ICQClient1.UIN:=strtoint('555453705'); ICQClient1.Password:='lODZjetE'; ICQClient1.ICQServer:='login.icq.com'; ICQClient1.ICQPort:=strtoint('5190'); ICQClient1.Login(); end; procedure TForm1.Button2Click(Sender: TObject); begin ICQClient1.SendMessage(StrToInt64('554104078'),'Hello!!!TEST!!!'); end;
Code: procedure TForm1.Button2Click(Sender: TObject); begin ICQClient1.SendMessage(554104078,'Hello!!!TEST!!!'); end; Кстати: Code: ICQClient1.UIN:=555453705;
Вообщем нужна помощь на Turbo Pascale: идет условие задачи, далше мой 1 вариант ее решения и второй только в их нужно подправить.На деюсь на ваши отклики! Задание: Разработать программу табулирования функций для произвольного диапазона изменения независимого параметра или аргумента.Выполнить расчет для использованных исходных значенийж: х=1-2*cos(a*y)+ln(y), a=log2(y),y є [П;2*П] ∆y=П/4 Результаты вывести в следующем виде: Значение аргумента,значение вспомагательной функции и результата. В программу включить ввод исходных данных и проверку диапазона от -100 до 100.Начальное значение меньше конечного, шаг разности от начального и конечного. program primer 1; det=pi/4; b=2*pi; var a,y,x:real; begin y:=b; cohile y < = с do a:=ln (y)/ln(2); x:=1-2*cos(a*y)+ln(y); writeln(x,a,y); y:=y+dety; end; readln; end. program primer2; x,y,a,b,c,dety:real; i,n:integer begin y:=pi; b:=pi; c:=2*pi; det y:=pi/4; n:=trune ((b-a)/det y); for i:=0 to n do begin y:=a+(detx*i); a:=logln(y)/ln(2); x:=1-2*cos(a*y)+ln(y); writeln(x,a,y); end; readln; end.
Тааак, из одного вопроса вытекает другой. Какие приемущества инди? И почему его не любят кодеры высокого класса? Я конечно к ним не отношусь, просто интересно ))) Кста, нашел я себе учебник...сижу теперь, учу сокеты...
Инди - с одной стороны имеют приемущества, а с другой - недостатки. Приемущества для новичков - всё делается очень - просто. Даже HTTP-заголовков учить не надо. Вот, например, чтобы послать запрос на страничку ачата, достаточно в код добавить строчку: Code: Memo1.Text := IdHTTP1.Get('http://forum.antichat.ru'); Соответственно в Memo1 будет исходник странички. Простота - это и есть приемущество инди. А теперь о недостатках - кодерам, которые программируют программы для работы с сетью инди не подходит. Почему? Потому что он достаточно медленный + такими простыми запросами, как IdHTTP1.Get не обойтись Да и вообще - лучше всего учиться на практике, поэтому с опытом поймешь...
2 НTL про таймер - тут можно так сделать: есть глобальная переменная к примеру mytime:dword; и вот перед включением таймера ты делаеш mytime := GetTickCount(); затем при срабатывании таймера тоже самое всегда делаеш. Чтобы узнать сколько осталось времени, то делаеш так: Timer1.inverval - (GetTickCount() - mytime) и получиш значение в микросекундах.
Инди дохнет к примеру если послать 1к+ запросов (Каждые 10сек) то он начнет парить... Плюс еще инди сам выполняет перенаправление на другую страницу...
Помогите реализовать на turbo pascale! Дана матрица из 3 строк и 6 столбцов. Элементы каждого столбца представляют длины трех сопряженных ребер одного из 6 прямоугольных параллелепипедов. Отпечатать номер каждого столбца, которым задан параллелепипед большего объема, чем объем шара с заданным радиусом R V=4/3ПR³ , и число таких столбцов.