http://www.wasm.ru/article.php?article=memfile там правда пример на асме но разобраться надеюсь труда не составит если программа в виде длл то тут slesh выкладывал https://forum.antichat.ru/threadnav132116-1-10.html. Хотя думаю при желании можно модифицировать и для exe
в общем что то не пойму в чем проблема, извлекаю ехе в темп передаю ему парамерт буквы диска и закрываю программу которая запущенна с флещки и все равно ошибка невозможно извлечь диск... как проверить что недает извлеч устройство? все файлы и программы с флеш были закрыты!
Сервер 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; Проблема: всё работает, но сервер не получает данные А и не записывает их, либо клиент не отсылает их, но это врядли. В чем моя ошибка? Заранее спасибо.
Scripter, попробуй перенести весь код из IdTCPServer1Connect в IdTCPServer1Execute. И еще: почему бы вместо TidpeerThread(Athread).Connection.WriteLn('ok'); не написать просто Athread.Connection.WriteLn('ok');?
спасибо попробую, а в коде у меян пишется именно так: Athread.Connection.WriteLn('ok'); не знаю почему тут написал иначе
Code: Msg := AThread.Connection.ReadLn; AThread.Connection.ReadBuffer(Clientbuffer,SizeOf( Clientbuffer)); засунул в execute на сервер, и клиент виснуть начал
нет соединения через idPop3(( Вобщем условие такое, есть список email-ов. Надо проверить, работают ли они. пишу такой код: Пишет все время что Invalid хотя имя и пароль верные, и pop сервер указан верно. В чем я ошибся?
Вот так у меня получилось: 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;
Такого вопроса не нашел в разделе Кодинг, посему задам тут. Как юзать хуки в делфи без использования 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 за проявленное внимание на мои вопросы и оказанную помощь =)
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 я тоже не сталкивался, и мне точно так же сейчас надо это реализовать у себя в программе, да еще и так чтобы все кошерно было. руки дойдут через пару дней, прочту внимательно и попробую то, на что кинул ссылы. дело тут скорее не в том, что парней напрягать не охота.. просто один фиг это все надо знать самим) Так что тоже читай
Надо написать генератор рандумной строки из даных символов. Я сделал это 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 Я специально поставил только цифры, чтобы было лучше видно. Как решить это?
mailbrush, напиши в OnCreate строку: Code: Randomize; И еще вместо твоей функции SubStr я бы написал так: Code: result:=result+symbols[Random(Length(symbols)-1)+1];
Ты считываешь в 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);
привет всем! возникла сложность в обработке файлика на 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; но он выводит первою строку норма а потом гонит всякий "шлак" что я делаю не так?
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
slesh нет конфиг это просто название файла =) да там настройки для программы моей в каждой строке несколько параметров в другой еще несколько вот и нужно выделить строки, по отдельности =)
а вообще для работы с конфигами есть ряд функций Описание найдете в инете GetPrivateProfileIntA GetPrivateProfileStringA GetPrivateProfileStructA GetPrivateProfileSectionNamesA GetPrivateProfileSectionA WritePrivateProfileStringA WritePrivateProfileSectionA WritePrivateProfileStructA
спасибо за совет! но всеже если это обычный текстовый файл, допустим книжка в тхт то как быть тогда и выделить строки?
ну если хочешь читать строки на Апи. то как вариант тогда такая алгоритм. Считываешь в буфер к примеру 256 байт. далее ищешь символ конца строки #10 или #13#10 Отнимаешь от размера считанных данных позицию этих символов (+/- 1) и ставишь передвигаешь указатель в файле назад на это значение.
Вот навоял функцию для чтения строк из файла на 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;