[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. CaLLIka

    CaLLIka Member

    Joined:
    31 Aug 2009
    Messages:
    21
    Likes Received:
    11
    Reputations:
    0
    Ребят,нужна помощь есть прога маленькая,написана походу на делфи 7,исходников нет,
    Вводишь данные,она производит расчет и выводит отчет,надо убрать некоторые формы для ввода данных,которые используются только в отчете.возможно?пробовал через де де,я не понимаю нихрена в этом,что менять и как :( кто может помочь стукните в асю
     
  2. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    задача
    есть бинарный файл(200кб), в его теле 1 раз (смещение заранее не известно) содержится последовательность из заранее заданных 5 байт.
    Требуется заменить эти 5 байт на другие заранее заданные 5 байт, сохранив все остальное, в.т.ч. и название файла.


    (если более точно, то требуется заменить CD 16 0F 85 09 на CD 16 90 90 90 в одном системном файле)

    вопрос в том как сделать это с минимумом камасутры, за ответы спс :)
    побайтово читать и сохраняя буффер из последних 5 символов писать новый файл, а затем удалить оригинал и на его место записать "новый" - в голову пришло. Но как-то это тупо...
    кто-нибудь знает менее нерациональные способы?
     
    #4462 ErrorNeo, 23 Oct 2009
    Last edited: 23 Oct 2009
  3. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    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.
    з.ы.: в итерации ошибка скорее всего =)
     
    1 person likes this.
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    т.к. файл не большой, то проще былобы замаппить его в оперативу с правами на запись. Сразу память просканить на наличие данной сигнатуры, затем сразу изменить значение в памяти и отмаппить файл. Скорость бы была напорядок выше.
     
    #4464 slesh, 23 Oct 2009
    Last edited: 23 Oct 2009
    1 person likes this.
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    для тех кто не умеет юзать файл маппинг вот пример:

    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 молчал.
     
    #4465 slesh, 23 Oct 2009
    Last edited: 23 Oct 2009
    1 person likes this.
  6. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    slesh, твоя захардкоденая функция CompareMem - это ведь тоже самое, что и lstrcpyn?
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    нет lstrcpyn - это копирование строки, а CompareMem сравнение памяти
     
  8. DiHWO

    DiHWO Member

    Joined:
    23 Oct 2009
    Messages:
    93
    Likes Received:
    10
    Reputations:
    0
    ребят, есть статья по отправке сокетов через хттп протокол? оч надо.
     
  9. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Как узнать сколько времени у таймера осталось? Без камасутры
     
  10. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Если тебе надо для теста, а не для написания сложных программ, то можешь юзать Indy. Это встроенный компоннент Delphi.

    WinSock, конечно, лучше, но его используй потом - когда освоишь азы протокола :)
     
    1 person likes this.
  11. sherlock

    sherlock Member

    Joined:
    22 Aug 2009
    Messages:
    0
    Likes Received:
    10
    Reputations:
    0
    Прога должна отправлять собщение на 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;
     
    2 people like this.
  12. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26

    Code:
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    ICQClient1.SendMessage(554104078,'Hello!!!TEST!!!');
    end;
    
    Кстати:

    Code:
    ICQClient1.UIN:=555453705;
     
    #4472 НTL, 24 Oct 2009
    Last edited: 24 Oct 2009
  13. sherlock

    sherlock Member

    Joined:
    22 Aug 2009
    Messages:
    0
    Likes Received:
    10
    Reputations:
    0
    Нероботает...
     
    8 people like this.
  14. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26

    Анти-спам на 554104078 есть? Если до то добавь 555453705 в КЛ 554104078
     
  15. >>serhio<<

    >>serhio<< New Member

    Joined:
    10 Feb 2009
    Messages:
    40
    Likes Received:
    0
    Reputations:
    0
    Вообщем нужна помощь на 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.
     
  16. DiHWO

    DiHWO Member

    Joined:
    23 Oct 2009
    Messages:
    93
    Likes Received:
    10
    Reputations:
    0
    Тааак, из одного вопроса вытекает другой. Какие приемущества инди? И почему его не любят кодеры высокого класса? Я конечно к ним не отношусь, просто интересно ))) Кста, нашел я себе учебник...сижу теперь, учу сокеты...
     
    #4476 DiHWO, 25 Oct 2009
    Last edited: 25 Oct 2009
  17. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Инди - с одной стороны имеют приемущества, а с другой - недостатки. Приемущества для новичков - всё делается очень - просто. Даже HTTP-заголовков учить не надо. Вот, например, чтобы послать запрос на страничку ачата, достаточно в код добавить строчку:
    Code:
    Memo1.Text := IdHTTP1.Get('http://forum.antichat.ru');
    Соответственно в Memo1 будет исходник странички. Простота - это и есть приемущество инди.

    А теперь о недостатках - кодерам, которые программируют программы для работы с сетью инди не подходит. Почему? Потому что он достаточно медленный + такими простыми запросами, как IdHTTP1.Get не обойтись :) Да и вообще - лучше всего учиться на практике, поэтому с опытом поймешь...
     
    1 person likes this.
  18. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 НTL про таймер - тут можно так сделать:
    есть глобальная переменная к примеру mytime:dword;
    и вот перед включением таймера ты делаеш mytime := GetTickCount();
    затем при срабатывании таймера тоже самое всегда делаеш.
    Чтобы узнать сколько осталось времени, то делаеш так:
    Timer1.inverval - (GetTickCount() - mytime) и получиш значение в микросекундах.
     
    2 people like this.
  19. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Инди дохнет к примеру если послать 1к+ запросов (Каждые 10сек) то он начнет парить...
    Плюс еще инди сам выполняет перенаправление на другую страницу...
     
  20. >>serhio<<

    >>serhio<< New Member

    Joined:
    10 Feb 2009
    Messages:
    40
    Likes Received:
    0
    Reputations:
    0
    Помогите реализовать на turbo pascale!
    Дана матрица из 3 строк и 6 столбцов. Элементы каждого столбца представляют длины трех сопряженных ребер одного из 6 прямоугольных параллелепипедов. Отпечатать номер каждого столбца, которым задан параллелепипед большего объема, чем объем шара с заданным радиусом R V=4/3ПR³ , и число таких столбцов.
     
Thread Status:
Not open for further replies.