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를 찾곤 하죠.. ^^





    • 박구남
    • 1999.01.07 11:10
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 정창헌
      1999.06.03 02:15
      db그리드의 칼럼의 글자크기조정이 안되는데 어떻게 하면 되나요? 부탁합니다...
    • 이정욱
      1999.01.09 10:49
      receivetext 이벤트의 부분을 보여주세요. 어떻게 코딩을 하셨는지 봐야 알겠습니다. 박구남 wrote: >...
    • 신인재
      1999.06.03 05:01
      디비그리드를 찍고 마우스 오른쪽버튼을 누르면 컬럼editor를 부를 수 있습니다. 거기서 각 칼럼의 폰트를 ...
    • 박구남
      1999.01.12 22:05
      아구 해결했네요 제가 개념이 좀 않잡혔던 모양입니다 그런데 receivetext는 있으나 마나하군요 보아하...
    • 기노현
    • 1999.06.03 00:01
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.06.03 05:04
      dgMultiSelect 옵션을 True로 주시고 함 해보세요.... 기노현 께서 말씀하시기를... > DBGrid에서 여러...
    • 박구남
    • 1999.01.07 11:10
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.01.09 10:49
      receivetext 이벤트의 부분을 보여주세요. 어떻게 코딩을 하셨는지 봐야 알겠습니다. 박구남 wrote: >...
    • 박구남
      1999.01.12 22:05
      아구 해결했네요 제가 개념이 좀 않잡혔던 모양입니다 그런데 receivetext는 있으나 마나하군요 보아하...
    • 신인재
      1999.06.03 05:11
      dgmultiselect 옵션을 True로 주시고 해당 레코드로 포인터를 옮긴 후 dbGrid1.SelectedRows.Curren...
    • 구민오
    • 1999.01.06 10:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.01.07 05:30
      구입하실 수 있습니다. 나이렉스로 전화해 보세요. 521-7900 입니다. 구민오 wrote: > RASAPI에 관한...
    • 유민호
      1999.06.03 21:57
      Query1.Delete는 안되지요! 따로 Delete SQL문장을 쓰시던가 아니면 TTable을 사용하세요. 그리고 Tabl...
    • 구민오
    • 1999.01.06 10:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.01.07 05:30
      구입하실 수 있습니다. 나이렉스로 전화해 보세요. 521-7900 입니다. 구민오 wrote: > RASAPI에 관한...
    • 이강범
      1999.06.02 19:23
      항상 델파이를 사랑하는 사람을 사랑하시는 당신에게 찬사를 보냅니다. 델파이에서 스크린 세이버를 직...
    • 이정욱
      1999.01.05 23:34
      프로세스를 금지시킨다는것 보다.. 먼저 데스크탑만한 폼을 하나 생성한 후 , 데스크탑의 그림들을 그대로...
    • 안치봉
      1999.06.02 21:13
      이강범 께서 말씀하시기를... > 항상 델파이를 사랑하는 사람을 사랑하시는 당신에게 찬사를 보냅니다. >...
    • 안치봉
      1999.06.02 20:10
      이강범 께서 말씀하시기를... > 항상 델파이를 사랑하는 사람을 사랑하시는 당신에게 찬사를 보냅니다. >...
    • 장석원
    • 1999.06.02 19:23
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박윤희
      1999.06.02 21:22
      장석원 께서 말씀하시기를... > 델에서 오라클 에러코드를 받을려면 어떻게 해야 하나요. > server 환경...
    • 김동수
      1999.06.02 18:35
      DataBase 테이블에서 원하는 레코드만... 한개 또는 여러개를 지우는 방법 좀 알려주세요...! 모든 레코...
    • 이정욱
      1998.12.13 05:29
      네.. 다 맞는 말씀입니다. 한가지만 빼구요.. 델파이는 파스칼에 기반된 언어입니다. 파스칼이 아닙니다...
    • 이상국
      1998.12.17 03:49
      이정욱 wrote: > 네.. 다 맞는 말씀입니다. > 한가지만 빼구요.. > 델파이는 파스칼에 기반된 언어입니...
    • 이정욱
      1998.12.17 08:58
      ^^ 네.. 맞는말씀입니다.. 하지만 인프라이즈사 측에서는 오브젝트 파스칼과는 다른 언어로 생각을 하는것 ...
    • 개장수
      1999.01.05 17:10
      고럼 C++ 은 어찌되는건지요 ? 고것도 C 에서 개발된거 아닌가 ? 으음. 잘 모르겄군요. 하지만 Delphi는 확...
    • 북해
    • 1999.06.02 18:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.06.02 20:12
      북해 께서 말씀하시기를... > 안녕하세요. MessageDlg에 표시되는 문자열 중에 일부분을 원하는 색상으로 ...
    • 꺄꿍
    • 1998.11.21 03:03
    • 9 COMMENTS
    • /
    • 0 LIKES
    • 박중호
      1999.06.02 11:39
      저는 정보처리 산업기사 실기를 델파이로 봅니다...근데 실기 문제의 조건중에 입력화면 클리어후 출력하...
    • 이 재원
      1999.01.05 16:56
      거시기 TMemo에는 32K Limit이 있는걸로 알고 있는데 혹시 더 큰거 아닌가요? 글코 크기 Value를 100에서 ...
    • 종모
      1999.06.02 17:40
      안녕하십니까. 델파이를 사랑하는 초보델돌이 종모입니다. 조금의 도움이 될수 있으면 합니다. -------...
    • 신인재
      1998.11.24 02:16
      냥냥.... 쩝...이상하군요...... 디비 익스플로러에서 잘된다면 델파이 어플에서도 잘되야 정상이거든요...
    • 꺄꿍
      1998.11.24 10:22
      신인재 wrote: > 냥냥.... > 쩝...이상하군요...... > 디비 익스플로러에서 잘된다면 > 델파이 어플에...
    • 신인재
      1998.11.24 22:40
      음냐.... 저두 방법이 없군요.... 이거 받아서 테스트 해보세요.. 실행파일과 소스를 함께 넣었습니다.....
    • 이정욱
      1998.11.21 14:56
      제 생각에는 Richedit데이터를 Memo에서 읽으려고 하는것 같네요. 리치에디트 데이터를 메모로 읽으려고 ...
    • • • •
    • 조영우
    • 1999.01.03 00:56
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 김학선
      1999.06.02 11:10
      배열 포인터 사용을 알고 싶습니다. var ttt : array[0..10] of integer; ptrttt : pointer; //...
    • 이정욱
      1999.01.03 02:11
      델파이의 TServerSocket과 TClientSocket을 이용하시면 됩니다. 그 컴포넌트들로 TCP/IP 를 이용하여 서로...
    • 안치봉
      1999.06.02 20:35
      김학선 께서 말씀하시기를... > 배열 포인터 사용을 알고 싶습니다. > > var > ttt : array[0..10]...
    • 강경중
    • 1999.06.02 06:36
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최석기
      1999.06.02 17:59
      강경중 께서 말씀하시기를... > 김영대님이 올리신 자료중에 > 중복 실행방지 자료가 있습니다.(마지막에...
    • 이정욱
      1999.01.05 23:34
      프로세스를 금지시킨다는것 보다.. 먼저 데스크탑만한 폼을 하나 생성한 후 , 데스크탑의 그림들을 그대로...
    • 조영우
    • 1999.01.03 00:56
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 박형진
      1999.06.02 03:34
      스트링그리드에서의 삽입,삭제를 하려고 할때에 삽입시 원하는 위치에 삽입되고, 중간 row 삭제시 아래부...
    • 이정욱
      1999.01.03 02:11
      델파이의 TServerSocket과 TClientSocket을 이용하시면 됩니다. 그 컴포넌트들로 TCP/IP 를 이용하여 서로...
    • 김경수
      1999.06.02 04:14
      안녕하세요. 일반 서적을 거론하는게 좀 그렇지만요. "delphi programming bible" 석봉현,신문섭공저 라는...
    • 최진숙
    • 1998.12.28 21:09
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 오승섭
      1999.06.02 03:25
      TreeView에서 다른TreeView로 Drag&Drop하는 방법 좀 부탁드립니다.
    • 이정욱
      1998.12.29 00:26
      가능하면 Async의 질문은 나이렉스 고객지원 게시판에 해주시기 바랍니다. TCom의 예제를 보시면 OnProtoc...
    • 김경수
      1999.06.02 04:24
      안녕하세요. 아래의 싸이트에 구창민님 홈페이지의 팁/강좌란에 가셔서 "treeview"라고 입력하시면 정지훈...
    • 최진숙
    • 1998.12.28 21:09
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 조민연
      1999.06.02 03:12
      TreeView를 사용해서 업무순서도를 만들려고 합니다. 그런데 TreeView에서 Add나 AddChild를 사용하면 ...
    • 이정욱
      1998.12.29 00:26
      가능하면 Async의 질문은 나이렉스 고객지원 게시판에 해주시기 바랍니다. TCom의 예제를 보시면 OnProtoc...
    • 김경수
      1999.06.02 04:26
      안녕하세요. 위의 질문에 보시면 구창민님 홈의 팁/강좌란에 treeview강좌가 있습니다. treeview의 전반...
    • 하명훈
    • 1999.06.02 02:44
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 이현주
      1998.12.25 02:04
      asyncpro를사용하여 모뎀제어하는 프로글렘을하는데 comnumber를 property 나 messagebox에서 받지않고 w...
    • 변대섭
      1999.06.02 18:42
      하명훈 께서 말씀하시기를... > TDatasource가 update될때 현재 날짜를 필드에 넣고 싶은데 시간까지 같이...
    • 박현정
      1998.12.25 05:40
      Async의 Comport컴포넌트를 이용하면 현재 시스템에서 사용가능한 comport들을 가져올 수 있습니다. 컴포트...
    • 김경수
      1999.06.02 04:09
      안녕하세요.. 저는요 일반 테이블에 날짜를 입력하는경우에는 datetype보다는 그냥 integer형으로 저장하...