본문 바로가기
Delphi, RadStudio

[개발/Delphi] 사용중인 dll 파일의 덮어씌우기 ( 펌 )

by SB리치퍼슨 2010. 8. 9.

 출처 : 델마당 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

보라커피님이 알려주셔서 파일을 첨부합니다.

반응형

댓글