Microsoft MVP성태의 닷넷 이야기
클릭원스로 배포 한 프로젝트가 끝났는지 알 수 있는 방법 [링크 복사], [링크+제목 복사],
조회: 11069
글쓴 사람
heyhey (jeanie1oo at naver.com)
홈페이지
첨부 파일
 

안녕하세요 성태님

성태님 덕분에 Clickonce에 대해 많이 알게 되었습니다.
그런데, 아직 진행 중에 안되는 것이 있어서 질문 드립니다.

WindowsFormApplication1 에서 Button을 통해 process URL을 지정하여
WindowsFormApplication2를 배포하였습니다.

그 때 WindowsFormApplication1에서 Button을 눌렀을 시
WindowsFormApplication1은 보이지 않는 상태가 되고,
WindowsFormApplication2가 보이게 되며
또 다시 WindowsFormApplication2를 종료 시
WindowsFormApplication1이 다시 보이게끔 하고 싶은데

WindowsFormApplication1에서

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim myProcess As Process
    myProcess = System.Diagnostics.Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " +
                http://xxx.xxx.xx.xx:xxx/WindowsFormApplication2.application)

    Me.Visible = False
    myProcess.WaitForExit()

    Me.Visible = True
End Sub

이렇게 줬는데 WaitForExit() 명령어가 아예 WindowsFormApplication2 란 것을 인지 못하는 것 같습니다.
어떻게 해야할까요?

디버깅결과 Me.Visible이 False 변했다가 바로 True 로 바뀝니다.
WaitForExit()는 로컬컴퓨터에서만 실행시킨 파일을 종료되었는지만 확인 할 수 있더군요.
배포는 로컬컴퓨터에 했지만 실행은 서버에 있는 application을 실행했기 때문인가봅니다.
서버에서 실행시킨 파일도 WaitForExit() 할 수 있을까요?

WaitForExit() 대신 hasExited도 사용해봤습니다.


Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim myProcess As Process
    myProcess = System.Diagnostics.Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " +
                http://xxx.xxx.xx.xx:xxx/WindowsFormApplication2.application)

    Me.Visible = False

    If myProcess.hasExited = True then
        Me.Visible = True
    end if
End Sub

역시 안되더군요.
hasExited도 로컬컴퓨터내에서만 사용가능하더군요.

그래서 방법을 다르게 생각해봤습니다.
어짜피 Clickonce로 배포는 이미 했고, C:/Users/xxxx/AppData/Local/Apps/2.0/ 여기에 배포가 되니
내가 실행시킨 WindowsFormApplication2.exe 가 종료 되었을 때 Visible = True 로 변경하면 되겠구나.

근데 생각한대로 코딩이 안떠오르네요.
실행한 프로젝트 이름을 찾는 명령어도 그렇고
그 실행프로젝트가 종료 되었을 때 하는 명령어도 모르겠네요.

단지, 서버에서 실행시킨 파일이 종료되었을때 Me.Visible을 True로 바꾸고싶어서
구글링을 해봐도 제가 원하는 답은 나오질 않네요ㅠ

=================================================================================================

Msgbox(myprocess.ProcessName) 해봤을때
실행 프로그램이 WindowsApplication2.exe 가 아닌 Rundll32로 표시가 되네요
이러니 Rundll32.exe 는 WindowsApplication2.exe 를 키고나서 바로 종료되니
myProcess.WaitForExit()가 바로 되는걸까요?








[최초 등록일: ]
[최종 수정일: 7/31/2017]


비밀번호

댓글 작성자
 



2017-07-31 12시19분
마지막의 질문에 언급한 것처럼, 위의 코드에서 myProcess는 rundll32.exe 프로세스에 대한 것이므로 그 프로세스가 종료하면 WaitForExit가 반환됩니다. 이런 경우에는 서로 간에 협업을 위한 코드를 작성하는 것이 좋겠지만, 그런 것이 안된다면 다음과 같은 식의 방법을 이용해 맞춰주는 수밖에 없습니다.

C# - 특정 EXE 프로세스를 종료시킨 EXE를 찾아내는 방법
; http://www.sysnet.pe.kr/2/0/11172

그 외에 배포된 exe를 찾아서 직접 수행하는 방법은, 아마도 ClickOnce가 해주는 업데이트 혜택을 받지 못하므로 그에 대한 처리를 고려해야 할 것입니다.
정성태
2017-08-01 05시59분
[heyhey] Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim myProcess As Process
    myProcess = System.Diagnostics.Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " +
                http://xxx.xxx.xx.xx:xxx/WindowsFormApplication2.application)

    Me.Visible = False
    myProcess.WaitForExit()

    Me.Visible = True
End Sub
[guest]
2017-08-01 06시05분
[heyhey] 제가 어제 하루종일 고민해서 낸 답은 Application2.exe 프로세스를 실행중인 프로세스 목록에서 찾아서 WaitForExit()를 하는 방법입니다.
그래서
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim myProcess As Process
    myProcess = System.Diagnostics.Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " +
                http://xxx.xxx.xx.xx:xxx/WindowsFormApplication2.application)

     Me.Visible = False
     Threading.Thread.Sleep(2000)

            Dim myProcesses() As Process
            Dim myProcess_ As Process
            myProcesses = Process.GetProcesses()

            For Each myProcess_ In myProcesses
                If myProcess_.ProcessName.Equals("WindowsFormApplication2") Then
                    myProcess_.WaitForExit()
                    Threading.Thread.Sleep(1000)
                    Me.Visible = True
                    Exit For
                End If
            Next
End Sub

WindowsFormApplication2를 실행할 때 Clickonce 연결하는시간 한2초정도 걸리더군요.
그래서 Thread를 2초 지연시켰습니다.
그런다음 실행중인 프로세스 배열을 만들어 WindowsFormsApplication2 라는 이름이 있는지 비교를 하나하나해서
종료시켰더니 제가 원하는 방향으로 잘 됬습니다.

그런데, 이건 너무 비효율적인 것 같습니다.
일단 컴퓨터 사양에 따라 Clickonce가 2초가 걸릴지 몇초가 걸릴지도 모르는거고,
만약 배포할 컴퓨터에 WindowsFormsApplication2 가 없다면 설치하는 시간만 2초가 넘어가서 실행이 안됩니다.

댓글을 봤는데 협업을 위한 코드를 작성하라 하셨는데 무슨말인 잘 모르겠습니다.
특정 EXE 프로세스를 종료시킨 EXE를 찾아내는 방법도요..
아직 개발 초보자라...ㅠ
[guest]
2017-08-01 07시11분
[heyhey] 아닙니다 성태님
방금 엄청 쉬운방법으로 해결했네요ㅠ
굳이 쓰레드를 지연시킬필요가 없었네요...
하 이걸 하루종일 고민하다니 ㅠ
[guest]
2017-08-01 07시15분
[heyhey] 아 아니네요 - -;
해결된게 아니였네...하 역시 이렇게 쉽게 될리가 없겠죠...
[guest]
2017-08-01 12시52분
협업이란 것은 다른 의미가 아니고, Event Signal 같은 것을 통해서 알려주는 코드를 서로 간에 해놓아야 한다는 것입니다.

세 번째 덧글의 방법대로 할 거라면, Process.GetProcessesByName을 사용해서 무한 루프(하지만 최대 10초 정도) 동안 Thread.Sleep을 100ms 정도 간격으로 새로 뜬 프로세스를 확인하도록 하고 WaitForExit를 주는 것도 좋을 것입니다. 암튼, 이런 식에서는 깨끗한 방법이 없습니다.
정성태
2017-08-02 02시21분
[heyhey] 제가 글로만 봐서는 이해가 안가는데 예제로 간단하게 설명해 주실 수 있으신가요?
서로간에 알려주는 코드를 작성해야한다하셨는데
Button1을 클릭할때 핸들러로 임의의 코드를 생성해서
그 코드가 맞으면 WaitForExit() 한다는건가요?

================================================

그리고 깨끗하진 않지만,
성태님 말씀대로 Process.GetProcessesByName을 사용해서
무한 루프를 주려고 하는데

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myProcess As Process
            myProcess = System.Diagnostics.Process.Start(sFileName, "dfshim.dll,ShOpenVerbApplication " + "http://xxx.xxx.xx.xx:xxxx/WindowsFormsApplication2.application)

            Me.Visible = False
            Threading.Thread.Sleep(2000)

            Dim myProcesses() As Process
            Dim myProcess2 As Process
            myProcesses = System.Diagnostics.Process.GetProcessesByName("WindowsFormApplication2")
            ' Iterate through the process array.

            Dim i As Integer
            For i = 1 To 50 Step 1
                For Each myProcess2 In myProcesses
                    If myProcess2.ProcessName.Equals("WindowsFormApplication2") Then
                        myProcess2.WaitForExit()
                        Threading.Thread.Sleep(800)
                        Me.Visible = True
                        Exit For
                    Else
                        Threading.Thread.Sleep(1000)
                    End If
                Next
            Next

이렇게 50초까지만 무한루프를 주려고했는데
결과가 이상하게 나오네요.

공부도 할 겸 2가지 방법 다 해보려고하는데
간단한 예제로 도움을 주실 수 있으신지.. 부탁드립니다
[guest]
2017-08-02 01시28분
실행하는 프로세스에서 new EventWaitHandle(...,"Test",...)라는 식으로 생성해 두고, 해당 이벤트를 대기한 다음 실행되는 프로세스에서 EventWaitHandle.OpenExisting("Test")으로 열어 Event.Set을 해주면 실행되었는지 알 수 있습니다. 마찬가지로 종료는 반대 과정으로 하면 알 수 있을 것입니다. (따라서, 실행하는 측과 실행되는 측의 코드가 함께 변경되어야 합니다.)

두번째는, 대략 아래와 같은 식으로 하면 될 것입니다.

int retry = 10;

while (retry-- > 0)
{
    var proc = Process.GetProcessesByName("WindowsFormApplication2");
    if (proc.Count == 0) { Thread.Sleep(500); continue; }
  
    proc[0].WaitForExit();
}
정성태

... 46  47  48  49  50  51  52  53  54  55  56  57  58  59  [60]  ...
NoWriterDateCnt.TitleFile(s)
1116C#조으다1/27/201317096비프음을 컴퓨터 내장 스피커로 출력하려면.. [2]
1114박재율12/28/201210322WCF 세션과 스트리밍 동시사용에 관해. [1]
1113박진영12/28/201220721윈도우 2008 64비트 닷넷 오류 문의드립니다. [13]
1112이대근12/18/201214960[질문] odp.net 배포 관련 궁금한게 있어서 질문좀 드릴게요 [3]
1111나그넹!12/13/201211413안녕하세요. 파일전송에 관련해서 궁금한것좀 여쭈고싶네요. [1]
1110김동현12/11/201213406안녕하세요 닷넷 신입개발자입니다 Clickonce 질문좀 하겠습니다. [6]파일 다운로드1
1109김성우12/5/201210368WCF IIS 호스팅 관련하여 질문 드립니다. [1]
1123윤용한3/13/201310538    답변글 [답변]: WCF IIS 호스팅 관련하여 질문 드립니다.
1107우라미윰11/22/201217317안녕하세요. RSA공개키 알고리즘에 나와있는 글을 보고 응용을 해야 하는데 막히는 부분이 있어서 질문드립니다. [3]파일 다운로드1
1106초급11/21/201210959WCF Server 인증서 및 Client 인증서 문의 [1]
1104hon11/17/201210561VS2008에서 디버그/릴리즈 환경중에 디버그 환경의 빌드시 배열의 자동 초기화 라는 것에 대해서 궁금합니다. [3]
1102최년호11/15/201213213[탭 브라우저의 윈도우 핸들 구하기] 예제에서 활성화 방법 [1]
1100박진영11/7/201218861[긴급] 코드 액세스 보안 정책(CASPOL.exe) 설정해도 SmartClient 보안에러가 발생합니다. [6]
1099Hyey...10/22/201213017php에서 c file compile [4]
1095이지은10/8/201230197중단점이 현재 적중되지 않았습니다 [3]
1094고민남10/6/201210595NScreen 에 대해 어떻게 생각하십니까? [1]
1093이지수10/6/20129966vbs [1]
1092김성수9/20/201211199안녕하세요? MS Windows server 2008 R2 에서 IIS7 의 SSL 설정시에 에러 해결좀 도와주세요 [1]
1089한상욱9/13/201211140azure에 관한 질문입니다. [1]
1088김영대9/12/201213305DirectX.AudioVideoPlayBack 참조하여 wav 재생기를 제작하여 SmartClient 를 이용하여 aspx 페이지에 Embed 하는 과정의 질문 사항입니다. [2]
1087한우주9/10/201213998SSL 모든 웹페이지에 적용해야하나요? [2]
1086한우주9/4/201212177SSL 인증서 범용으로 사용하기 [3]
1085한우주9/4/201210582개발환경구성 18.3.1 에 대한 문의 [2]파일 다운로드1
1084김종하9/3/201211585team foundation express 2012에서 새 프로젝트 생성... [3]
1082김대경8/23/201210534windows2008 에서 ActiveX 사용 시 문제점. [3]
1091김대경9/20/201210574    답변글 [답변]: windows2008 에서 ActiveX 사용 시 문제점. [2]파일 다운로드1
... 46  47  48  49  50  51  52  53  54  55  56  57  58  59  [60]  ...