Q&A

  • 김영대님 봐주세요........
김영대님이 올리신 자료중에

중복 실행방지 자료가 있습니다.(마지막에 추가 하겠습니다.)

그 자료를 이용하여 실행하면 2번째 실행 때는

이미 실행중이라는 메세지를 나타내고 종료합니다.

그러나 문제는 어플리케이션이 달라도

중복 실행방지를 적용하면 두번째로 실행하는 어플리케이션은

이미 실행중이라는 메세지를 나타냅니다.

다시 말해 어플 A 와 어플 B 둘다 중복 실행방지 자료를 이용하여

프로그래밍하면 A를 두번 실행하던, B가 실행 중일때 A를 실행하던

모두 이미 실행중이라는 메세지를 나타냅니다.

좀 도와 주세요



그리고 죄송하지만 하나만더.......

ShellExecute 문을 사용할 때 uses 부분에 어떤것을 추가해야 합니까?

김영대님의 도움으로 델파이를 공부하는 경중..............







[팁] 어플리케이션의 중복실행 방지 2

쓰신분 : 김영대님

unit Unit1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;



type

TForm1 = class(TForm)

procedure FormActivate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

function ExistPrevInst: Boolean;

end;



var

Form1: TForm1;



implementation

{$R *.DFM}



function TForm1.ExistPrevInst: Boolean;

var

semName,

appClass: PChar;

hSem : THandle;

hWndMe : HWnd;

appTitle: Array[0..MAX_PATH] of Char;

begin

// 초기화

Result := FALSE;

GetMem(semName, 15);

GetMem(appClass, 15);

StrPCopy(semName, 'SemaphoreName');

StrPCopy(appClass, 'TApplication');

StrPCopy(appTitle, ExtractFileName(Application.Title));



// semaphore를 생성한다

// 만약 첫번째 instance이면 hSem 은 0을 갖게 된다

hSem := CreateSemaphore(nil, 0, 1, semName);



// semaphore 가 이미 존재하는지 검사

// 있다면 두번째 instance

if (hSem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then

begin

CloseHandle(hSem);

// 이전 instance를 찾기 위해 지금의 instance의 title을 바꾼다

hWndMe := FindWindow(appClass, appTitle);

SetWindowText(hWndMe, '중복검사중');



// 만약 이전 instance를 찾았다면 전방(front)로 보낸다

// 이전 application의 class and title로 찾는다

hWndMe := FindWindow(appClass, appTitle);

if (hWndMe <> 0) then

begin

BringWindowToTop(hWndMe);

ShowWindow(hWndMe, SW_SHOWNORMAL);

end;

Result := TRUE;

end;



// 사용된 메모리 해제

FreeMem(semName, 15);

FreeMem(appClass, 15);

end;



procedure TForm1.FormActivate(Sender: TObject);

begin

if ExistPrevInst then // 이전 instance가 있다

begin

Close;

end;

end;



end.



1  COMMENTS
  • Profile
    최석기 1999.06.02 17:59
    강경중 께서 말씀하시기를...

    > 김영대님이 올리신 자료중에

    > 중복 실행방지 자료가 있습니다.(마지막에 추가 하겠습니다.)

    > 그 자료를 이용하여 실행하면 2번째 실행 때는

    > 이미 실행중이라는 메세지를 나타내고 종료합니다.

    > 그러나 문제는 어플리케이션이 달라도

    > 중복 실행방지를 적용하면 두번째로 실행하는 어플리케이션은

    > 이미 실행중이라는 메세지를 나타냅니다.

    > 다시 말해 어플 A 와 어플 B 둘다 중복 실행방지 자료를 이용하여

    > 프로그래밍하면 A를 두번 실행하던, B가 실행 중일때 A를 실행하던

    > 모두 이미 실행중이라는 메세지를 나타냅니다.

    > 좀 도와 주세요

    >

    > 그리고 죄송하지만 하나만더.......

    > ShellExecute 문을 사용할 때 uses 부분에 어떤것을 추가해야 합니까?

    > 김영대님의 도움으로 델파이를 공부하는 경중..............

    >

    >

    >

    > [팁] 어플리케이션의 중복실행 방지 2

    > 쓰신분 : 김영대님

    > unit Unit1;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

    >

    > type

    > TForm1 = class(TForm)

    > procedure FormActivate(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > function ExistPrevInst: Boolean;

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    > {$R *.DFM}

    >

    > function TForm1.ExistPrevInst: Boolean;

    > var

    > semName,

    > appClass: PChar;

    > hSem : THandle;

    > hWndMe : HWnd;

    > appTitle: Array[0..MAX_PATH] of Char;

    > begin

    > // 초기화

    > Result := FALSE;

    > GetMem(semName, 15);

    > GetMem(appClass, 15);

    > StrPCopy(semName, 'SemaphoreName');

    > StrPCopy(appClass, 'TApplication');

    > StrPCopy(appTitle, ExtractFileName(Application.Title));

    >

    > // semaphore를 생성한다

    > // 만약 첫번째 instance이면 hSem 은 0을 갖게 된다

    > hSem := CreateSemaphore(nil, 0, 1, semName);

    >

    > // semaphore 가 이미 존재하는지 검사

    > // 있다면 두번째 instance

    > if (hSem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then

    > begin

    > CloseHandle(hSem);

    > // 이전 instance를 찾기 위해 지금의 instance의 title을 바꾼다

    > hWndMe := FindWindow(appClass, appTitle);

    > SetWindowText(hWndMe, '중복검사중');

    >

    > // 만약 이전 instance를 찾았다면 전방(front)로 보낸다

    > // 이전 application의 class and title로 찾는다

    > hWndMe := FindWindow(appClass, appTitle);

    > if (hWndMe <> 0) then

    > begin

    > BringWindowToTop(hWndMe);

    > ShowWindow(hWndMe, SW_SHOWNORMAL);

    > end;

    > Result := TRUE;

    > end;

    >

    > // 사용된 메모리 해제

    > FreeMem(semName, 15);

    > FreeMem(appClass, 15);

    > end;

    >

    > procedure TForm1.FormActivate(Sender: TObject);

    > begin

    > if ExistPrevInst then // 이전 instance가 있다

    > begin

    > Close;

    > end;

    > end;

    >

    > end.

    >



    실행 해보지는 않았지만 위의 코딩을 보니까 제대로 실행될꺼 같은데요??

    혹시 두 어플리케이션의 Title이 같은거 아닌가요??

    기존의 어플리케이션이 생성된지 여부를 어플리케이션의 Title로 찾는거 같은데..



    그리고 ShellExecute는 ShellApi라는 Unit에 포함되어 있습니다.

    개인적으로 전 이런 모르는 함수의 존재 유닛을 찾을 때는 윈도우즈의 찾기로 델파이에 Source 디렉토리에 대해 해당 함수 이름으로 파일 내의 문자영 찾기로 선언된 Unit를 찾곤 하죠.. ^^