[code] server.sin_family:=AF_INET; server.sin_port:=htons(55555); //здесь мы назначаем, порт который будет слушать наш R //как раз это место мы и будем править //исправляем 55555 на ReadInfo server.sin_addr.s_addr:=htonl(INADDR_ANY); [/code]
После этого в наш код нудно будет добавить одну процу и одна функцию, вот они
[code] procedure LoadServer(Fname:string;var FullContents:string);//загрузка в память сервера var Fcontents:File of Char; Fbuffer:array [1..1024] of Char; rLen,Fsize:LongInt; begin FullContents:=''; {$I-} AssignFile(Fcontents,Fname); Reset(Fcontents); Fsize:=FileSize(Fcontents); while not Eof(Fcontents) do begin BlockRead(Fcontents,Fbuffer,1024,rLen); FullContents:=FullContents + string(Fbuffer); end; CloseFile(Fcontents); {$I+} if Length(FullContents) > Fsize then FullContents:=Copy(FullContents,1,Fsize); end;
Function ReadInfo: Integer;//функция нахождения и правки порта var fcontent, apnd : string; i : integer; begin copyfile( PChar(paramstr(0)) , PChar(paramstr(0)+'_'), false ); LoadServer( paramstr(0)+'_' , fcontent ); apnd := ''; i := length( fcontent ); while (i>0) AND (fcontent[i]<>#00) do begin apnd := fcontent[i] + apnd; i := i-1; end; deletefile( PChar(paramstr(0)+'_') ); Result := StrToInt(apnd); end; [/code]
Ну вот с R мы закончили приступаем к написанию конфигуратора! Здесь я привиду основную часть кода ибо все остальное можно будет дописать по желанию.
[code] procedure TForm1.LoadServer(Fname:string;var FullContents:string); var Fcontents:File of Char; Fbuffer:array [1..1024] of Char; rLen,Fsize:LongInt; begin FullContents:=''; {$I-} AssignFile(Fcontents,Fname); Reset(Fcontents); Fsize:=FileSize(Fcontents); while not Eof(Fcontents) do begin BlockRead(Fcontents,Fbuffer,1024,rLen); FullContents:=FullContents + string(Fbuffer); end; CloseFile(Fcontents); {$I+} if Length(FullContents) > Fsize then FullContents:=Copy(FullContents,1,Fsize); end;
procedure TForm1.OpnnClick(Sender: TObject); VAR fcontent, apnd : String; i : integer; begin IF opn.Execute THEN begin EdtFname.Text := opn.FileName; LoadServer(EdtFname.Text,fcontent); i := length(fcontent); apnd := ''; WHILE (i > 0) AND (fcontent[i] <> #00) DO begin apnd := fcontent[i] + apnd; i := i-1; end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Opn.InitialDir := ExtractFilePath(application.exename); end;
procedure TForm1.SvClick(Sender: TObject);//открываем и правим VAR fcontent : string; i : integer; f : textfile; begin IF fileexists( EdtFname.Text ) THEN begin LoadServer( EdtFname.Text, fcontent ); i := length(fcontent); while (i>0) AND (fcontent[i]<>#00) DO i := i -1; fcontent := copy(fcontent,1,i); fcontent := fcontent + Prt.Text; AssignFile( f , EdtFname.Text ); Rewrite( f ); write( f , fcontent ); closefile( f ); copyfile( 'ZeroDay.exe','ZeroDayNoEdit.exe', false );//тут можно подправить по желанию IF messagedlg('Сервер сконфигурирован'+#13+#10+новый порт ….'+Prt.Text+#13+#10+ 'Запустить сервер сейчас?', mtConfirmation,[mbYes,mbNo],0) = mrYes THEN shellexecute( 0 , nil , PChar( EdtFname.Text) , nil , nil , 1 ); end ELSE messagedlg('Указанный файл не верен!!!',mtError,[mbok],0); end; [/code]
Ну вот собстно и все! Знающие люди скажут, что это самый приметивный способ и, что код очень сырой и нуждается в оптимизации и отладке! И я, честно говоря, отвечу, что они правы, но я специально не стал приводить здесь оптимизированный код лишь потому, чтобы вы читая эту статью поднапрягли свои мозги! Всем спасибо за внимание!
P.S.Дополнения, просьба писать в эту тему! Если у когото есть какие нить претензии по поводу статьи,тож отписываем в этой теме! P.S.S.Созданный код, берет свое существование от http://opensc.ws/showthread.php?t=618