Q&A

  • 자동 다운로드 프로그램 작성시 의문점
자동 다운로드 프로그램을 만들고자 합니다.

과정은,

프로그램 실행

--> 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;



3  COMMENTS
  • Profile
    정광호 2001.11.24 19:50
    정광호 wrote:



    답변 주신 분들 고맙습니다.



    두 분이 주신 답변에 따라 테스트를 해 보았지만 아니 되는군요.



    문제는 파일 복사에 있는 것이 아닌 듯 싶기도 하고...



    아뭏든 답변 주신분들 항상 행복하세요.





  • Profile
    지나가는이... 2001.11.24 01:49
    CopyFile대신에 아래의 Function을 사용해보세요...

    function fcSHCopy(srcfname,tgtfname: string): boolean;

    var

    inf: TSHFileOpStruct;

    FHandle: THandle;

    begin

    Result := False;



    srcfname := srcfname+#0#0;

    tgtfname := tgtfname+#0#0;

    inf.wnd := FHandle;

    inf.wFunc := FO_COPY;

    inf.pFrom := PChar(srcfname);

    inf.pTo := PChar(tgtfname);

    // inf.fFlags := FOF_SIMPLEPROGRESS;

    inf.fFlags := 0 or FOF_MULTIDESTFILES;

    inf.lpszProgressTitle := 'Copy중입니다';

    if SHFileOperation(inf) = 0 then

    Result := True

    else

    Result := False;

    end;



    정광호 wrote:

    > 자동 다운로드 프로그램을 만들고자 합니다.

    > 과정은,

    > 프로그램 실행

    > --> 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;

    >

  • Profile
    이경문 2001.11.22 10:24
    Download가 아직 정상적으로 완료되지 않은 상태에서

    CopyFile을 하려고 해서 생기는 문제같습니다.

    ShowMessage가 Download라는 함수가 정상적으로 종료되는 데

    시간을 벌어주는 셈이지요.

    정확한 원인이라고 할 수는 없지만요... ^^



    정광호 wrote:

    > 자동 다운로드 프로그램을 만들고자 합니다.

    > 과정은,

    > 프로그램 실행

    > --> 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;

    >