Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 자료실
Delphi Programming Resources
[8] 자동 업데이트 ~~~
죠스고기 [wind1026] 9083 읽음    2002-01-26 09:28
작성일 : 오늘 ^^;                                                              

작성이유 : 걍 ~~~                                                              

문제점 : 사용자가 경로를 바꿀 경우 절대 경로를 찾지 못하고, 또 하나는         
          파일확장자가 (*.lnk) 즉 바로가기 파일일 경우 바로가기 파일의          
          경로에 새 파일이 저장된다. 고로 고치는 방법은 절대경로를 찾아내는    
          API 나 함수를 작성해서 파일 다운 받을때 경로를 지정해 주면 되죠 ~      
          근데 제가 몰라서요 ~ 저 좀 갈카줘요 ^^                                


원래 몸체가 있어야 하잖아요. 이건 업데이트랑 메인이랑 분리된 형태입니다.
전에 인터넷TV 맹글때 사용했던 거구요 ~ 이젠 공개합니다...ㅠㅠ
뭐 합하고 싶으면 알아서들 하시구요.... 정말 허접한 방법이라 공개해 말어
고민했는데, 걍 합니다. 글구 혹시 위의 문제점 해결하면 저 좀 갈카주세요.
돕고 살아야죠 ~~ 코드가 너무 지저분하죠 ~^^*



unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Psock, INIFiles, NMFtp,shellapi, ComCtrls;
// 추가된 class --> inifiles , shellapi
type
  TForm1 = class(TForm)
    FTP: TNMFTP; // 델파이에 있는 그 FTP 컴포넌트를 그대로 썼습니다.
    ProgressBar1: TProgressBar;
    Label1: TLabel;
    procedure FTPConnect(Sender: TObject);
    procedure FTPConnectionFailed(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FTPPacketRecvd(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FTPConnect(Sender: TObject);
begin
  Label1.Caption:= '서버 접속 성공';
 
  try  FTP.Download('ettasictv.ini', 'c:\ettasictv.ini');except
     ftp.Disconnect;
     showmessage('파일 다운 에러');
     Application.Terminate;
  end;
end;

procedure TForm1.FTPConnectionFailed(Sender: TObject);
begin
   Label1.Caption:= '서버 접속 실패';
   Application.Terminate;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
tvHandle : THandle ;       // 프로세스 ID 를 찾기 위한 핸들
ettasicini1 : TINIFile;  // 레지스트리를 사용하지 않고 ini 로 처리했습니다.
ettasicini : TINIFile;   // 버젼 비교를 위한 ini 를 생성하기 위한 변수.
ver1,ver2 : string;
begin

   ftp.Host:='210.96.103.103'; //host주소
   ftp.UserID:='anonymous'; //ID
   ftp.Password:=''; //passwd
   ftp.Timeout := 0;
   ftp.Port:=21;
   try
     ftp.Connect;except
     ftp.Disconnect;
     showmessage('서버에 접속이 실패.');
     Application.Terminate;
end;


ettasicini := TiniFile.Create (ExtractFilePath(Application.ExeName) + 'ettasictv.ini'); // 로컬에 있는 ini 를 생성
ettasicini1 := TiniFile.Create ('c:\ettasictv.ini'); // FTP 서버로부터 다운로드 받은 ini 를 생성

   ver1 := ettasicini1.ReadString('version','ver','');  // ini의 버젼 정보를 읽는다.
   ver2 := ettasicini.ReadString('version','ver','');
ettasicini1.free;  // ini 를 free 시켜줌

Deletefile('C:\ettasictv.ini');  // 다운로드 받은 ini를 삭제

if ver1 = ver2 then begin  // 서버로 부터 받은 ini와 로컬의 ini에 있는 버젼을 비교
     showmessage('업데이트 할 내용이 없습니다.'); // 같으면 정보를 보여주고
     Application.Terminate; // 끝낸다.
end else begin

     tvHandle := FindWindow('TForm1','Ettasic TV'); // Class Name 과 Window Name 을 찾는다.(main폼...)

     if tvHandle > 32 then   // 찾으면
         PostMessage(iHandle, WM_QUIT, 0, 0);  // 핸들을 잡아서 종료


         ftp.Mode(MODE_IMAGE); // 바이너리 모드로 전환

         setCurrentdirectory('ExtractFilePath(Application.ExeName)'); //ftp로 다운받을 디렉토리 위치
            if FileExists('EttasicTV.exe') then //이미 있으면 지우고 다운받기
             begin
                Deletefile('EttasicTV.exe'); // 이전 파일을 삭제하고
            end;

   try
     ftp.Download('EttasicTV.exe', 'EttasicTV.exe');  // 파일을 다운받는다.
     Application.ProcessMessages; // 다운로드가 끝날때 까지 대기
   except
     ftp.Disconnect;  // 예외처리
       showmessage('파일다운에러');
       Application.Terminate;
  end;

     showmessage('업데이트가 성공적으로 끝났습니다.');

    WinExec(PChar(ExtractFilePath(Application.ExeName)+ 'EttasicTV.exe'), SW_SHOW);  // 다운로드받은 exe 를 실행
      Application.Terminate; // 자기를 죽이고
end;
end;

procedure TForm1.FTPPacketRecvd(Sender: TObject);
begin
   ProgressBar1.Position := Trunc((FTP.BytesRecvd / FTP.BytesTotal) * 100); // 프로그레스 움직이기
   Label1.Caption := '파일 받는 중....';
end;

end.
//////////////////////////////////////////////////////////////
//레지스트리를 사용할 경우는 uses 절에 registry 추가하시고, 아래와
//같이 코딩할 수 있죠...
//더 이상은 무리 ~ 대충 레지스트리 이용할대 이런 식으로 셋팅하시면
//됩니다.
{
var
   Registry: TRegistry;
   S : string;
begin
   Registry:=TRegistry.Create;                        // 레지스트리 생성
   Registry.RootKey:=HKEY_LOCAL_MACHINE;              // HKEY_LOCAL_MACHINE
   Registry.OpenKey('경로',False);      // 레지스트리에서 정보를 연다.

   S := Registry.ReadString('InstallDir');      // 레지스트리에서 디렉토리 정보를 읽어온다.
   strOldVer := Registry.ReadString('Ver');

   PC_Dir := S + '\';

   Registry.CloseKey;                                 // 레지스트리 Close
   Registry.Free;                                    // 레지스트리 Free
end;


중요한것 빼먹을뻔 했네.... Regedit 에 필요한것 !!!

                    1. InstallDir  : c:\프로그램명
                    2. UpdateServer : IP
                    3. UpdateUser : ID
                    4. UpdatePassword : P/W
                    5. Ver : Vision 명
}////////////////////////////////////////////////////////////////////

+ -

관련 글 리스트
8 자동 업데이트 ~~~ 죠스고기 9083 2002/01/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.