[ 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. bons

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

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    http://www.wasm.ru/article.php?article=memfile
    там правда пример на асме но разобраться надеюсь труда не составит
    если программа в виде длл то тут slesh выкладывал https://forum.antichat.ru/threadnav132116-1-10.html. Хотя думаю при желании можно модифицировать и для exe
     
  2. transserg

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

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    в общем что то не пойму в чем проблема, извлекаю ехе в темп передаю ему парамерт буквы диска и закрываю программу которая запущенна с флещки и все равно ошибка невозможно извлечь диск... как проверить что недает извлеч устройство? все файлы и программы с флеш были закрыты!
     
  3. Scripter

    Scripter Member

    Joined:
    3 Sep 2008
    Messages:
    141
    Likes Received:
    95
    Reputations:
    6
    Сервер
    Code:
    procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
    var
      text: string;
    begin
    text := 'test';
    AThread.Connection.ReadBuffer(Clientbuffer,SizeOf(Clientbuffer)); //читаем то что шлет клиент при подключении
    Clientbuffer.login := AnsiLowerCase(Trim(Clientbuffer.Login)); //удаляем пробелы по краям и вводим в нижний регистр для сверки
    if text = Clientbuffer.Login then //сверям
    TidpeerThread(Athread).Connection.WriteLn('ok'); //если верно, отсылаем клиенту ОК
    end;
    
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
    Msg    : String;
    begin
    Msg    := AThread.Connection.ReadLn; //читаем значение
    memo1.Lines.Add(Msg); //записываем значение
    end;


    Клиент
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    with SendBuffer do
     begin
     Login := edit11.text; //заполняем буфер данными перед отправкой
     end;
    idTCPclient1.Connect; //подключаемся
    idTCPClient1.WriteBuffer(SendBuffer,SizeOf(SendBuffer),true); //шлем данные
    
    if idTCPclient1.ReadLn = 'ok' then //если ответ ОК то
    begin
    Memo1.Lines.Add(Подрубились); //пишем подрубились
    button2.enabled := true; //делаем кнопку доступной
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
    A : integer = 0;
    begin
    inc(A);
    IdTCPClient1.writeln(intToStr(A)); //отсылаем значение А серверу
    end;


    Проблема: всё работает, но сервер не получает данные А и не записывает их, либо клиент не отсылает их, но это врядли.
    В чем моя ошибка? Заранее спасибо.
     
  4. Nullsleep

    Nullsleep Member

    Joined:
    2 Jun 2009
    Messages:
    67
    Likes Received:
    26
    Reputations:
    0
    Scripter, попробуй перенести весь код из IdTCPServer1Connect в IdTCPServer1Execute.
    И еще: почему бы вместо TidpeerThread(Athread).Connection.WriteLn('ok'); не написать просто Athread.Connection.WriteLn('ok');?
     
    2 people like this.
  5. Scripter

    Scripter Member

    Joined:
    3 Sep 2008
    Messages:
    141
    Likes Received:
    95
    Reputations:
    6
    спасибо попробую, а в коде у меян пишется именно так:
    Athread.Connection.WriteLn('ok');
    не знаю почему тут написал иначе :D
     
    1 person likes this.
  6. Scripter

    Scripter Member

    Joined:
    3 Sep 2008
    Messages:
    141
    Likes Received:
    95
    Reputations:
    6
    Code:
    Msg    := AThread.Connection.ReadLn;
    AThread.Connection.ReadBuffer(Clientbuffer,SizeOf(  Clientbuffer)); 
    засунул в execute на сервер, и клиент виснуть начал
     
    3 people like this.
  7. yfet

    yfet Banned

    Joined:
    11 Jul 2009
    Messages:
    48
    Likes Received:
    19
    Reputations:
    5
    нет соединения через idPop3((
    Вобщем условие такое, есть список email-ов. Надо проверить, работают ли они. пишу такой код:


    Пишет все время что Invalid хотя имя и пароль верные, и pop сервер указан верно. В чем я ошибся?
     
    3 people like this.
  8. ZdezBilYa

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

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19
    Вот так у меня получилось:

    Code:
    for i:=0 to ss.Count-1 do
     begin
      Divide(ss.Strings[i],Dest1,Dest2, Dest3);
      pop:='pop.'+copy(Dest3, pos('@', Dest3)+1,10000);
      IdPOP31.Host:=pop;
      IdPOP31.Port:=110;
      IdPOP31.Username:=Dest1;
      IdPOP31.Password:=Dest2;
    try
     IdPOP31.Connect;
     ListBox2.Items.Add(Dest1+':'+Dest2+' - Valid')
    except
     ListBox2.Items.Add(Dest1+':'+Dest2+' - Invalid') ;
    end;
     IdPop31.Disconnect;
    end;
    ss.Free;
    
     
  9. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    Такого вопроса не нашел в разделе Кодинг, посему задам тут.

    Как юзать хуки в делфи без использования DLL?

    Конкретно интересует пример хука на отлов окон до их прорисовки на экране.

    Нагуглил такой код:
    Code:
    Function WndHookProc(nCode:Integer;wParam:UINT;lParam:UINT):LRESULT; stdcall;
    begin
    Wnd:=FindWindow(nil,PChar('Безымянный - Блокнот'));
    if nCode>=0 then
    if PCWPStruct(lParam).Message=WM_SHOWWINDOW then begin
    // Работа с окном блокнота тут
    end;
    Result:=CallNextHookEx(HookHandle,nCode,wParam,lParam);
    end;
    
    Честно говоря - нифига непонятно =\ С хуками никогда не сталкивался. В гугле - примеры кейлоггера, но опять же: с помощью DLL.

    Буду благодарен за любой пример хука на отлов окон (с DLL или без нее).

    З.Ы. Greetz to Slesh & NullSleep за проявленное внимание на мои вопросы и оказанную помощь =)
     
  10. ErrorNeo

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

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    ex3me
    http://forum.antichat.ru/threadnav118323-1-10.html
    http://forum.oszone.net/post-292753-27.html
    http://www.wasm.ru/article.php?article=hiddndt
    http://www.wasm.ru/publist.php?list=21
    http://www.wasm.ru/article.php?article=apihook_3
    http://www.programmersforum.ru/showthread.php?t=18&highlight=%F1%EA%F0%FB%F2%FC+%EF%F0%EE%F6%E5%F1%F1
    http://www.programmersclub.ru/gruzin-api-perhvat/
    http://www.vr-online.ru/review.php?id=63

    я тоже не сталкивался, и мне точно так же сейчас надо это реализовать у себя в программе, да еще и так чтобы все кошерно было.
    :) руки дойдут через пару дней, прочту внимательно и попробую то, на что кинул ссылы.
    дело тут скорее не в том, что парней напрягать не охота.. просто один фиг это все надо знать самим) Так что тоже читай
     
  11. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Надо написать генератор рандумной строки из даных символов. Я сделал это
    Code:
    function SubStr(const Str: string; Start: Integer; Size: Word): string;
    begin
    SubStr := Copy(Str, Start, Size)
    end;
    
    function Rand(count,symbols: string): string;
    var
    i: integer;
    begin
      for i:=1 to StrToInt(count) do
        begin
          result:=result+SubStr(symbols,Random(Length(symbols)),1);
          Application.ProcessMessages;
        end;
    end;
    Но трабла в том, что генерит он не совсем рандумно. Пример: http://img44.imageshack.us/img44/7493/11637706.png
    Я специально поставил только цифры, чтобы было лучше видно.
    Как решить это?
     
  12. Nullsleep

    Nullsleep Member

    Joined:
    2 Jun 2009
    Messages:
    67
    Likes Received:
    26
    Reputations:
    0
    mailbrush, напиши в OnCreate строку:
    Code:
      Randomize;
    
    И еще вместо твоей функции SubStr я бы написал так:
    Code:
      result:=result+symbols[Random(Length(symbols)-1)+1];
    
     
    #3872 Nullsleep, 9 Aug 2009
    Last edited: 9 Aug 2009
  13. Nullsleep

    Nullsleep Member

    Joined:
    2 Jun 2009
    Messages:
    67
    Likes Received:
    26
    Reputations:
    0
    Ты считываешь в Clientbuffer, размер которого нулевой. Тебе нужно отсылать размер Sendbuffer'а перед отправкой.
    Перед idTCPClient1.WriteBuffer(SendBuffer,SizeOf(SendBuf fer),true);
    в клиентской части тебе нужно написать:
    Code:
    idTCPClient1.WriteInteger(SizeOf(SendBuffer));
    
    А в серверной изменить строку AThread.Connection.ReadBuffer(Clientbuffer,SizeOf( Clientbuffer));
    на:
    Code:
    AThread.Connection.ReadBuffer(Clientbuffer, AThread.Connection.ReadInteger);
    
     
    #3873 Nullsleep, 9 Aug 2009
    Last edited: 9 Aug 2009
  14. transserg

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

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    привет всем!
    возникла сложность в обработке файлика на winapi нужно выделить строки! стандартными способами делфи нехочу делать!
    пытаюсь сделать так
    Code:
    var
      Size:cardinal;
      mas:Array[0..65536] of char;
      Config:array of string;
    
    procedure ReadConfig;
      var
        re:^integer;
        MyFile:integer;
      begin
        MyFile:= Integer(CreateFile(PChar('sittings.txt'), GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ+FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0));
        GetMem(re,Sizeof(re));
        size:=Getfilesize(MyFile,nil);
        ReadFile(THandle(MyFile), mas, size, LongWord(re^), nil);
       Closehandle(MyFile);
      end;
    
    {$R *.dfm}
    Function PosEx(Const SubStr, S: String; Offset: Cardinal = 1): Integer;
    var
    I,X: Integer;
    Len, LenSubStr: Integer;
    begin
    If Offset = 1 Then
       Result := Pos(SubStr, S)
    Else
    begin
       I := Offset;
       LenSubStr := Length(SubStr);
       Len := Length(S) - LenSubStr + 1;
       While I <= Len Do
       begin
         If S[I] = SubStr[1] Then
         begin
           X := 1;
           While (X < LenSubStr) And (S[I + X] = SubStr[X + 1]) Do
             Inc(X);
           If (X = LenSubStr) Then
           begin
             Result := I;
             Exit;
           End;
         End;
         Inc(I);
       End;
       Result := 0;
    End;
    End;
    
    procedure ObrabConfig;
      var
        i,j:integer;
        S:string;
      begin
      i:=1;
      form1.Label2.Caption:=inttostr(Size);
      while i<10771 do
        begin
          j:=posex(#13#10,mas,i);
          S:=copy(mas,i,j);
          i:=j+3;
          j:=0;
          Setlength(Config,high(Config)+2);
          Config[high(Config)]:=S;
          Form1.memo1.lines.Add(S);
          Form1.Label1.Caption:=inttostr(i);
         Application.ProcessMessages;
          if i>=10771 then
          showmessage('ok');
          Sleep(50);
        end;
      end;
    
    
    но он выводит первою строку норма а потом гонит всякий "шлак"
    что я делаю не так?
     
  15. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 transserg как я понял тебе нужна работа с конфигом. То для таких целей советую юзать виндовую апишку
    GetPrivateProfileIntA - читает из конфига число
    GetPrivateProfileStringA - чистает из конфига строку
    Есть и другие, но тебе они не важны.
    Вот пример

    Code:
    var
     my_int:integer;
     my_str:array[0..255] of chat;
    begin
    my_int := GetPrivateProfileIntA('config', 'MY_INT_VAL', 20, 'c:\config.ini');
    GetPrivateProfileStringA('config', 'MY_STR_VAL', 'defoult value', my_str, 256, 'config.ini');
    
    
    где
    config - название секции
    MY_INT_VAL - название параметра
    20 - дефолтовое значение если число
    c:\config.ini - непосредственно файл
    defoult value - дефолтовое значение если строка
    256 - размер буфера.

    конфиг - стандартного оформления
    [config]
    MY_INT_VAL = 10
    MY_STR_VAL = hello
     
    #3875 slesh, 9 Aug 2009
    Last edited: 9 Aug 2009
  16. transserg

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

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    slesh нет конфиг это просто название файла =) да там настройки для программы моей в каждой строке несколько параметров в другой еще несколько вот и нужно выделить строки, по отдельности =)
     
  17. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    а вообще для работы с конфигами есть ряд функций
    Описание найдете в инете
    GetPrivateProfileIntA
    GetPrivateProfileStringA
    GetPrivateProfileStructA
    GetPrivateProfileSectionNamesA
    GetPrivateProfileSectionA

    WritePrivateProfileStringA
    WritePrivateProfileSectionA
    WritePrivateProfileStructA
     
  18. transserg

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

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    спасибо за совет! но всеже если это обычный текстовый файл, допустим книжка в тхт то как быть тогда и выделить строки?
     
  19. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну если хочешь читать строки на Апи. то как вариант тогда такая алгоритм.
    Считываешь в буфер к примеру 256 байт.
    далее ищешь символ конца строки #10 или #13#10
    Отнимаешь от размера считанных данных позицию этих символов (+/- 1)
    и ставишь передвигаешь указатель в файле назад на это значение.
     
  20. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вот навоял функцию для чтения строк из файла на Win API с поддержкой Win и nix форматов файла.

    Code:
    function ReadString(h:THANDLE; var s:string; max:integer):boolean;
    var
      buf:pchar;
      rb:dword;
      p:dword;
    begin
      result := false;
      getmem(buf, max);
      ReadFile(h, buf^, max, rb, nil);
      if rb > 0 then
      begin
        result := true;
        p := pos(#10, string(buf));
        if p = 0 then // если последняя строка
        begin
          s := string(buf);
        end
        else
        begin
          if (p > 1) and (buf[p-2] = #13) then // если Win формат
          begin
            s := copy(buf, 0, p-2);
          end
          else // если NIX формат
          begin
            s := copy(buf, 0, p-1);
          end;
          SetFilePointer(h, p - rb, nil, FILE_CURRENT);
        end;
      end;
      freemem(buf);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      h:THANDLE;
      s:string;
      x:integer;
    const
      MAX_LEN = 256;
    begin
      h := CreateFile('e:\test.txt', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
      if h <> INVALID_HANDLE_VALUE then
      begin
        for x := 1 to 10 do
        begin
          if ReadString(h, s, MAX_LEN) then // читаем строку
          begin // если считалась
            memo1.Lines.Add('Строка ' + inttostr(x) + ' - ' + s);
          end
          else break; // прерывем цикл если нет больше строк
        end;
        CloseHandle(h);
      end;
    end;
    
     
    3 people like this.
Thread Status:
Not open for further replies.