none
ap改版問題 RRS feed

  • 問題

  • dear all

    不知各位前輩j都是如何處理ap改版的問題,不可能一台一台去更新吧??

    我想這樣做  a.exe 是主程式, 在login時比對版號,如果有新版就執行 b.exe

    b.exe只是到主機的某個目錄把新的執行檔copy過來蓋掉a.exe

    我在a.exe 裏用shell(b.exe)結果不行,因為a.exe並沒有結束跟從記憶體釋放掉..

    請問有其他指令或其他做法嗎???

    謝謝..感恩..


    hm_sys_09
    2011年8月4日 下午 12:20

解答

  • 建議是由另一個行程來對主行程做版本檢查與更新的動作。
    否則有可能會被鎖。

    我也建議使用 System.Diagnostics.Process 來處理啟動應用程式的工作,因為它可以檢測 process 是否存在,如果有必要可以直接強制終止。
    但我覺得有可能是 thread 或訊息迴圈沒結束,才會導致 a.exe 沒有釋放掉。 

    還有,盡可能在進入訊息迴圈 (Application.Run()) 前做好版本檢測與更新的工作。 


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    • 已標示為解答 hm_sys_09 2011年8月5日 上午 07:51
    2011年8月5日 上午 02:35
    版主
  • 你可以試著用 Process 跑跑看。
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    • 已標示為解答 hm_sys_09 2011年8月6日 上午 08:31
    2011年8月5日 上午 10:03
    版主

所有回覆

  • 不知道ClickOnce的部署方式符不符合您的需求...

    ClickOnce 部署概觀
    Shadowと愉快なコード達
    Please correct me if my concept is wrong
    2011年8月4日 下午 12:28
  • a -> shell b -> end a -> update a -> shell a -> end b
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月4日 下午 02:31
  • dear 心冷熱情熄

    我的想法也是這樣,以下是我的程式

           a.exe  在啟動表單的form load時寫到

                '檢查版本
                Dim my_Sql As String = "select mVersion from Company"
                Dim m_DTB As New Data.DataTable
                Call objfrm.My_ADOReadData(my_Sql, m_DTB)
                If m_DTB.Rows.Count = 0 Then
                    MsgBox("找不到版本資料!!")
                Else
                    If Trim(m_DTB.Rows(0).Item("mVersion")) <> My_Version Then
                        MsgBox("有新版本!!請按確定!!")
                        Me.Close()
                        Shell("b.exe")
                    End If
                End If

           ......

          b.exe 在啟動表單的form load時寫到

            MsgBox("更新!!")

            Dim FileToCopy As String
            Dim NewCopy As String

            FileToCopy = "E:\test\MLS_NET.exe"
            NewCopy = "MLS_NET.exe"

            If System.IO.File.Exists(FileToCopy) = True Then
                System.IO.File.Copy(FileToCopy, NewCopy, True)
                MsgBox("版本已更新!!")
                Me.Close()
                Shell("a.exe")
            End If

    在 a.exe 中 shell(b.exe)就錯了..


    hm_sys_09
    2011年8月4日 下午 11:49
  • 建議是由另一個行程來對主行程做版本檢查與更新的動作。
    否則有可能會被鎖。

    我也建議使用 System.Diagnostics.Process 來處理啟動應用程式的工作,因為它可以檢測 process 是否存在,如果有必要可以直接強制終止。
    但我覺得有可能是 thread 或訊息迴圈沒結束,才會導致 a.exe 沒有釋放掉。 

    還有,盡可能在進入訊息迴圈 (Application.Run()) 前做好版本檢測與更新的工作。 


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    • 已標示為解答 hm_sys_09 2011年8月5日 上午 07:51
    2011年8月5日 上午 02:35
    版主
  • dear 小朱

    有問題向您請教

                'MLS_LOGIN.exe  檢查版本程式段  呼叫 UpSysProg.exe
                Dim my_Sql As String = "select mVersion from Company"
                Dim m_DTB As New Data.DataTable
                Call My_ADOReadData(my_Sql, m_DTB)
                If m_DTB.Rows.Count > 0 Then
                    If Trim(m_DTB.Rows(0).Item("mVersion")) <> My_Version Then
                        MsgBox("有新版本!!請按確定!!")
                        Me.Dispose()
                        Me.Close()
                        Dim SDProcess = New System.Diagnostics.Process()
                        SDProcess.StartInfo.FileName = "UpSysProg.exe"
                        SDProcess.Start()
                        'Shell("UpSysProg.exe", AppWinStyle.NormalFocus, False)
                    Else
                        Me.Dispose()
                        Me.Close()
                        Shell("MLS_NET.exe", AppWinStyle.NormalFocus, False)
                    End If
                End If

    'UpSysProg.exe程式段

            Try
                ''System.Diagnostics.Process
                Dim SDProcess = New System.Diagnostics.Process()
                SDProcess.StartInfo.FileName = "MLS_LOGIN.exe"
                SDProcess.Kill()

                FileToCopy = "E:\test\MLS_LOGIN.exe"
                NewCopy = "MLS_LOGIN.exe"
                If System.IO.File.Exists(FileToCopy) = True Then
                    System.IO.File.Copy(FileToCopy, NewCopy, True)
                End If

                FileToCopy = "E:\test\MLS_NET.exe"
                NewCopy = "MLS_NET.exe"
                If System.IO.File.Exists(FileToCopy) = True Then
                    System.IO.File.Copy(FileToCopy, NewCopy, True)
                End If

                MsgBox("版本已更新!!")
                Me.Dispose()
                Me.Close()
                Shell("MLS_NET.exe", AppWinStyle.NormalFocus, False)
            Catch ex As Exception

            End Try

    很寄怪..UpSysProg.exe單獨執行是ok的會執行Shell("MLS_NET.exe", AppWinStyle.NormalFocus, False),

    但是由MLS_LOGIN.exe呼叫執行時,會copy成功,但從 MsgBox("版本已更新!!") 開始就沒執行了.畫面一直掛著....

    我哪裏沒寫好???謝謝!!


    hm_sys_09
    2011年8月5日 上午 09:51
  • 你可以試著用 Process 跑跑看。
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    • 已標示為解答 hm_sys_09 2011年8月6日 上午 08:31
    2011年8月5日 上午 10:03
    版主
  • ok了,謝謝前輩
    hm_sys_09
    2011年8月6日 上午 08:31