김영대님이 올리신 자료중에
중복 실행방지 자료가 있습니다.(마지막에 추가 하겠습니다.)
그 자료를 이용하여 실행하면 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.
> 김영대님이 올리신 자료중에
> 중복 실행방지 자료가 있습니다.(마지막에 추가 하겠습니다.)
> 그 자료를 이용하여 실행하면 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를 찾곤 하죠.. ^^