작성일 : 오늘 ^^;
작성이유 : 걍 ~~~
문제점 : 사용자가 경로를 바꿀 경우 절대 경로를 찾지 못하고, 또 하나는
파일확장자가 (*.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 명
}////////////////////////////////////////////////////////////////////
|