자동 다운로드 프로그램을 만들고자 합니다.
과정은,
프로그램 실행
--> DB에서 버젼을 체크
--> 업버젼이 있으면 현재 폴더와는 다른 폴더로 다운로드
--> 다운로드 파일 실행
--> 버젼업전 프로그램 종료
--> 실행중인 파일이 다운로드 파일이면 홈폴더에 복사후 복사한 파일 실행하고 다운로드 파일 종료
--> 다운로드 완료
의문점은,
다운로드 파일 실행시 ShowMessage박스(아래의 --> 부분) 가 없으면
이 후의
CopyFile(PChar(wTmpFile),PChar(wHomeDir+wPgmName),false);
WinExec(PChar(wHomeDir+wPgmName), SW_SHOW);
프로시져가 실행되지 않는군요.
ShowMessage박스가 있으면 잘 되는데 왜 그럴까요?
도와주십시요. 벌써 3일째 고민중...
procedure TAsptStartForm.FormActivate(Sender: TObject);
var
sqlstr : String;
AsptReg, AutoRunReg : TRegistry;
wHomeDir, wPgmName, wVersion, wTmpFile : String;
wDownFile, wNewVersion : String;
LoginModal : TModalResult;
begin
try
AsptReg := TRegistry.Create;
AsptReg.RootKey := HKEY_LOCAL_MACHINE;
AsptReg.OpenKey('SOFTWAREAsptReport',True);
if not AsptReg.ValueExists('HomeDir') then // 신규등록
begin
// 파일정보 등록
AsptReg.WriteString('Homedir',ExtractFilePath(Application.ExeName));
AsptReg.WriteString('PgmName',ExtractFileName(Application.ExeName));
AsptReg.WriteString('Version',GGetCurrentDBDateTime(QTmp));
AsptReg.WriteString('TmpFile',ExtractFilePath(Application.ExeName)+'AspectReport_Tmp.exe');
AsptReg.CloseKey;
AsptReg.Free;
// 자동실행 등록
AutoRunReg := TRegistry.Create;
AutoRunReg.RootKey := HKEY_LOCAL_MACHINE;
AutoRunReg.OpenKey('SOFTWAREMicrosoftWindowsCurrentVersionRun',False);
AutoRunReg.WriteString('AspectReport',Application.ExeName);
AutoRunReg.CloseKey;
AutoRunReg.Free;
end
else // 버젼 비교 후 다운로드
begin
// 레지스트리 정보
wHomeDir := AsptReg.ReadString('Homedir');
wPgmName := AsptReg.ReadString('PgmName');
wVersion := AsptReg.ReadString('Version');
wTmpFile := AsptReg.ReadString('TmpFile');
// 정상실행인 경우
if UpperCase(ExtractFilePath(Application.ExeName))=UpperCase(wHomeDir) then
begin
QTmp.Close;
QTmp.SQL.Clear;
sqlstr := 'SELECT PGM_DATE FROM ASPT_PGM_BANK';
sqlstr := sqlstr + ' WHERE PGM_NAME='''+wPgmName+'''';
sqlstr := sqlstr + ' AND PGM_SQS=''1''';
QTmp.SQL.Add( sqlstr );
QTmp.Open;
if QTmp.FieldByName('PGM_DATE').AsString > wVersion then // Version이 변경되었으면
begin
DownLoad(wHomeDir, wPgmName, wDownFile, wNewVersion); // 다운로드
// Registry Update
AsptReg.WriteString('TmpFile',UpperCase(wDownFile));
AsptReg.WriteString('Version',wNewVersion);
AsptReg.CloseKey;
AsptReg.Free;
WinExec(PChar(wDownFile), SW_SHOW); // 다운받은 파일실행
Close; // 시스템 종료
exit;
end;
AsptReg.CloseKey;
AsptReg.Free;
end
// 현재 실행중인 파일이 다운받은 파일이면 Home Folder로 복사후 복사한 파일 실행
else if UpperCase(Application.ExeName)=UpperCase(wTmpFile) then // 대소문자 구분하드라
begin
--> 이부분 ShowMessage('프로그램의 업데이트가 완료되었습니다.'); // 반드시 있어야만 복사후 실행이 됨. (왜?)
CopyFile(PChar(wTmpFile),PChar(wHomeDir+wPgmName),false);
AsptReg.CloseKey;
AsptReg.Free;
WinExec(PChar(wHomeDir+wPgmName), SW_SHOW); // 복사한 파일실행
Close; // 시스템 종료
exit;
end
// 프로그램의 폴더를 옮긴경우
else if UpperCase(ExtractFilePath(Application.ExeName))<>UpperCase(wHomeDir) then
begin
AsptReg.WriteString('HomeDir',ExtractFilePath(Application.ExeName)); // Home Directory 변경
AsptReg.CloseKey;
AsptReg.Free;
end;
// 임시저장 파일이 있으면 삭제
if FileExists(wTmpFile) then DeleteFile(wTmpFile);
end;
except
end;
답변 주신 분들 고맙습니다.
두 분이 주신 답변에 따라 테스트를 해 보았지만 아니 되는군요.
문제는 파일 복사에 있는 것이 아닌 듯 싶기도 하고...
아뭏든 답변 주신분들 항상 행복하세요.