출처 : 델마당 http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?db=dmdqa&mode=read&num=22438&page=7&backdepth=1
안녕하세요? 조각달 황용호입니다.
결과적으로는 같겠지만 파일을 복사하고 복사할 파일이 사용 중일 때
리붓 후 실제 복사를 수행해 주는 API가 있습니다.
SetupInstallFile또는 SetupInstallFileEx라는 API입니다.
주로 윈도우 파일 설치를 담당하는 API군인데 SetupAPI.dll이라는 DLL이
제공해 주는 API입니다. 인스톨쉴드도 이 API를 사용합니다.
그런데 비주얼 C++은 이 API를 지원하는데 델파이는 SetyupAPI DLL은
전혀 지원을 하지 않더군요. JEDI 프로젝트에서는 진행하고 있을지
모르겠습니다만...
여튼 그래서 이 SetupInstallFile(Ex)를 사용하시기 위해서는
먼저 해당 API를 임포트하셔야 합니다.
다음은 제가 간이로 임포트 해놓은 유닛입니다.
FileCopyLater함수에 복사할 파일의 source와 destination을 지정해 주시면
파일이 사용중이 아닐 때는 그냥 복사하고 사용중일 때는 리부팅된 뒤에
복사되도록 해 주게 됩니다.
SetupInstallFileEx함수는 제가 구현해 놓은 기능 말고도 여러가지
서비스를 제공하며 또한 각종 상황을 콜백함수로 보내줄 수 있으므로
편리한 함수입니다. 자세한 내용은 MSDN이나 마이크로소프트 홈페이지에서
찾아 보시기 바랍니다.
그럼 이만...
unit LateCopy;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
const
SP_COPY_DELETESOURCE = $0000001;
SP_COPY_REPLACEONLY = $0000002;
SP_COPY_NEWER = $0000004;
SP_COPY_NEWER_OR_SAME = SP_COPY_NEWER;
SP_COPY_NOOVERWRITE = $0000008;
SP_COPY_NODECOMP = $0000010;
SP_COPY_LANGUAGEAWARE = $0000020;
SP_COPY_SOURCE_ABSOLUTE = $0000040;
SP_COPY_SOURCEPATH_ABSOLUTE = $0000080;
SP_COPY_IN_USE_NEEDS_REBOOT = $0000100;
SP_COPY_FORCE_IN_USE = $0000200;
SP_COPY_NOSKIP = $0000400;
SP_FLAG_CABINETCONTINUATION = $0000800;
SP_COPY_FORCE_NOOVERWRITE = $0001000;
SP_COPY_FORCE_NEWER = $0002000;
SP_COPY_WARNIFSKIP = $0004000;
SP_COPY_NOBROWSE = $0008000;
SP_COPY_NEWER_ONLY = $0010000;
type
PSP_FILE_CALLBACK = function(pContext: pointer; nNotification: UINT;
nParam1, nParam2: UINT): UINT; stdcall;
pInfContext = ^TInfContext;
TInfContext = record
Inc: THandle;
CurrentInf: THandle;
Section: UINT;
Line: UINT;
end;
function FileCopyLater(strSrc, strDst: string): Boolean;
function SetupInstallFileEx(InfHandle: THandle;
InfContext: pInfContext;
SourceFile: PChar;
SourcePathRoot: PChar;
DestinationName: PChar;
CopyStyle: DWORD;
CopyMsgHandler: PSP_FILE_CALLBACK;
Context: Pointer;
var FileWasInUse: Boolean): boolean; stdcall;
implementation
function SetupInstallFileEx; external 'setupapi.dll'
name 'SetupInstallFileExA';
function FileCopyLater(strSrc, strDst: string): Boolean;
begin
SetupInstallFileEx(0, nil, PChar(strSrc), nil, PChar(strDst),
SP_COPY_SOURCE_ABSOLUTE, nil, nil, Result);
end;
end.
# 2007-04-05
보라커피님이 알려주셔서 파일을 첨부합니다.
'Delphi, RadStudio' 카테고리의 다른 글
[개발/delphi] 중복 실행 방지 (0) | 2011.09.01 |
---|---|
[개발/delphi] 절대 죽지 않는 프로그램 만들기 (0) | 2011.08.01 |
[개발/delphi] Vista에서 프로그램 권한상승하기 (0) | 2011.08.01 |
[개발/Delphi] IE 띄우기, IE 실행하기 (0) | 2011.08.01 |
[delphi] 델파이에서 XML DOM사용 (간단한 팁) (0) | 2010.09.16 |
댓글