編寫遊戲更新器問題

Home Home
<< 1 2 3 >>
跳頁: (共 3 頁)
引用 | 編輯 n3ph223172
2011-08-08 21:18
樓主
推文 x0

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 史來姆
2011-08-08 22:22
1樓
  
這麼煩會有人來答嗎

獻花 x0
引用 | 編輯 ebolaman
2011-08-08 22:51
2樓
  
下面是引用 史來姆 於 2011-08-08 22:22 發表的 : 到引言文
這麼煩會有人來答嗎

或許不久後就會有了。


話說我對 VB2010 很多控制項的操作還不是很熟悉

尤其這種,通常都是以圖片來模擬操控項,看看有時候遊戲的解析度沒調好時,必須將滑鼠移動上面一點或下面一點才能取得焦點就知道

獻花 x1
引用 | 編輯 ebolaman
2011-08-09 14:53
3樓
  
研究了一下 CSO 的啟動器發現

他是以網頁的形式來放置按鈕等控制項

但是 HTML 有 onclick="external.Close" 的用法我就不知道 這要怎麼和程式本身整合

目前用了一個很笨的方法,是讓 a href 去連結 "Close", "Start", "Exit" 等字,讓 程式中的 Web_Browser1_Navigated 觸發並判斷連結

但是之後還要用 WebBrowser1.GoBack()




至於讀取條(Progress Bar) 的部分,只要把 圖片延長,用個函數即可

其他部分都可以用 Image 來覆蓋,這樣能解決 WebBrowser 無法與 VB.Net 整合的問題 (或是另有其他辦法?)



這是目前稍微模擬出來的介面,請參考








事實上是用兩個 WebBrowser 當作主頁面

程式碼中的 繪圖程序目前等於是沒有作用的,假如以 Image 控制項去取代 WebBrowser 的話,只需把 wb_back 去除即可

底下的程式碼的資源檔是從 CSOLauncher 提取出來的文件,並稍加修改



複製程式
Public Class frm_main

    '---------- Local variables ----------

    'Files & Folders
    Dim dataDir As String = System.IO.Directory.GetCurrentDirectory & "\HTML\"

    'Status
    Dim stat_check_obj_ind As Integer
    Dim stat_wb_complete As Integer

    'Background
    Dim rndTyp As Integer

    'Graphics
    Dim srcRect, dstRect As Rectangle
    Dim g As Graphics

    '---------- Local objects ----------
    Dim WithEvents wb, wb_back As New WebBrowser



    Private Sub frm_main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '----- Variables -----

        'Background
        Randomize()
        rndTyp = Rnd(1)

        'Graphics
        g = Me.CreateGraphics()

        'Status
        stat_wb_complete = 0

        '----- Form -----

        'Size
        Me.Size = New Size(704, 466)

        'Style
        Me.FormBorderStyle = 0
        Me.BackColor = Color.White

        '----- Sub -----

        AddHandler wb_back.Navigated, AddressOf local_event_wb_back_nav

        'Build objects
        local_build_obj()

    End Sub

    Private Sub frm_main_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        local_redraw_bg()
    End Sub

    Private Sub timer_check_obj_stat_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_check_obj_stat.Tick

        Dim flag As Boolean

        Select Case stat_check_obj_ind
            Case 1 'Web browser(Back)
                If wb_back.ReadyState = WebBrowserReadyState.Complete Then

                    wb.Navigate("http://tw.beanfun.com/cso/www/game_login.aspx")
                    local_new_objcheck(2)

                End If

            Case 2 'Web browser
                If wb.ReadyState = WebBrowserReadyState.Complete Then
                    wb.Visible = True : wb_back.Visible = True : flag = True
                    stat_wb_complete = 1
                    local_redraw_bg()
                End If

        End Select

        If flag Then timer_check_obj_stat.Enabled = False : stat_wb_complete = 0

    End Sub



    Private Sub local_redraw_bg()
        If stat_wb_complete = 0 Then Exit Sub

        Dim b As Bitmap

        b = IIf(rndTyp = 0, My.Resources.BG01, My.Resources.BG02)

        dstRect = Me.ClientRectangle
        srcRect = New Rectangle(New Point(0, 0), b.Size)

        g.DrawImage(b, dstRect, srcRect, GraphicsUnit.Pixel)

    End Sub

    Private Sub local_build_obj()

        Dim arrList As New List(Of Control)
        Dim arrSize As New List(Of Size)
        Dim arrPoint As New List(Of Point)
        Dim i As Integer

        arrList.Add(wb) : arrList.Add(wb_back)
        arrSize.Add(New Size(672, 240)) : arrSize.Add(New Size(688, 430))
        arrPoint.Add(New Point(8, 185)) : arrPoint.Add(New Point(0, 0))

        '--- Web browser ---
        For i = 0 To arrList.Count - 1
            arrList(i).Visible = False
            arrList(i).Parent = Me
            arrList(i).Size = arrSize(i)
            arrList(i).Location = arrPoint(i)
            wb.ScrollBarsEnabled = False : wb_back.ScrollBarsEnabled = False
        Next i

        wb_back.SendToBack()

        Dim tempPath As String = dataDir & "133.html"
        My.Computer.FileSystem.WriteAllText(tempPath, My.Resources._133, False)
        wb_back.Navigate("file://" & tempPath)
        local_new_objcheck(1)

    End Sub

    Private Sub local_new_objcheck(ByRef ind As Integer)
        stat_check_obj_ind = ind
        timer_check_obj_stat.Enabled = True
    End Sub

    Private Sub local_event_wb_back_nav()
        If stat_wb_complete <> 0 Then Exit Sub

        Dim flagDis As Boolean = True



        Select Case local_get_urlnav(wb_back.Url.ToString)
            Case "Start"
                wb_back.GoBack()

            Case "Exit"
                If MsgBox("更新作業進行中.請問要結束嗎?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then
                    End
                Else

                End If
            Case "Close"
                If MsgBox("更新作業進行中.請問要結束嗎?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then
                    End
                Else

                End If
            Case Else
                flagDis = False
        End Select


        If flagDis Then
            wb_back.GoBack()
        End If


    End Sub

    Private Function local_get_urlnav(ByRef url As String) As String

        Dim l As Long

        l = InStrRev(url, "/")
        local_get_urlnav = Mid(url, l + 1, Len(url) - l)

    End Function

End Class


本帖包含附件
檔名: zip CSOLauncher_Simulation.rar   (2022-06-09 14:18 / 382 KB)   下載次數:61


獻花 x1
引用 | 編輯 n3ph223172
2011-08-09 22:51
4樓
  
下面是引用 ebolaman 於 2011-08-09 14:53 發表的 : 到引言文
研究了一下 CSO 的啟動器發現
他是以網頁的形式來放置按鈕等控制項
但是 HTML 有 onclick="external.Close" 的用法我就不知道 這要怎麼和程式本身整合
目前用了一個很笨的方法,是讓 a href 去連結 "Close", "Start", "Exit" 等字,讓 程式中的 Web_Browser1_Navigated 觸發並判斷連結
但是之後還要用 WebBrowser1.GoBack()
.......

小弟想請問一下
為什麼當checkbox沒有打勾時
點擊開始遊戲,背景卻一直改變?

獻花 x0
引用 | 編輯 ebolaman
2011-08-09 23:12
5樓
  
下面是引用 n3ph223172 於 2011-08-09 22:51 發表的 : 到引言文
 
小弟想請問一下
為什麼當checkbox沒有打勾時
點擊開始遊戲,背景卻一直改變?

其實你點的 開始遊戲 並不是 Image ,而是 WebBrowser 裡面的一個圖片而已

因此我設定 點下去會連結到 "Start" ,雖然說 VB.NET 可以攔截 "點下去" 這個動作,但我不知道要如何 "取消這個動作"

因此接下來就會讓 WebBrowser 連結到 "Start" 這個頁面,也就當然地會找不到網頁

因此我偷偷地加上一行 "wb_back.Goback()",讓 WebBrowser 又連結回來 原本的頁面



而這個 WebBrowser 讀取的 HTML 碼中,背景圖片是在載入中就 隨機決定的

因此才會不斷切換


因此解決辦法是,想辦法找出 VB.NET 中能用 HTML 碼控制外部的程序,我就看到 CSOLauncher 原本的程式的 HTML碼中是用

<span class="BtClose"><a href="javascript:_null()" onclick="external.OnCancel()"> Close</a></span>
    <span class="BtGamestart_d"><a href="javascript:_null()" id="startGame">遊戲結?</a></span>
    <span class="BtExit"><a href="javascript:_null()" id="exitGame" onclick="external.OnCancel()">賵?抰戩</a></span>

的用法,代表可以與 程式本身整合,攔截 "點下去" 時這個動作,然後再來觸發 程式中程序


另外一個辦法就是 不要用 Web Browser

改以 Image 這個控制項 來替代,好處是能正確地 攔截 "點下去" 這個動作,麻煩的是位置還要調整


我已經蒐尋了很久,到目前為止還是找不到如何用 WebBrowser 來引發程式中的程序

只要能修改 HTML 碼,讓 WebBrowser 中的東西被點下時,VB程式中能判斷是點下哪個,就好辦了

獻花 x1
引用 | 編輯 ebolaman
2011-08-10 09:12
6樓
  
關於 VB.NET 好像是 VB 2005 的前身,這我也搞不太清楚

總之大家都習慣把 VB 分為兩階段,一個是 古老的 VB6 另外一個就是 VB.NET

至於該稱呼 VB.NET 還是 2005, 2008, 2010 這我就不知道





昨天又試了很多次,終於找到如何讓 WebBrowser 中的圖片被點下去時

VB 中可以一起被觸發


先要用這兩行來讓 程序被觸發時,可以一起觸發自己設定的函數

不過這次作的更新器模擬只有用到 Navigating 被觸發的時候

複製程式
        AddHandler wb_back.Navigating, AddressOf local_event_wb_back_nav
        AddHandler wb_back.Document.Click, AddressOf local_event_wb_back_click



然後在函數內可以用 wb_back.Document.GetElementById(Name) 來取得特定 ID 的物件

wb_back.Document.GetElementById(Name).GetAttribute(Attr) 則可以取得 屬性,例如 Checkbox 勾了沒

wb_back.Document.InvokeScript(Name, Obj) 則可以觸發 網頁中的 JavaScript,也能取得特定函數的值

wb_back.Document.ActiveElement.Name  則可以取得目前物件的名稱




有了以上方法,我就寫了第二版的 模擬CSO更新器



底下的程式碼在 Form1 (frm_main)

Form1 :

複製程式
Public Class frm_main

    '---------- Local structures ----------
    Structure struc_prg
        Dim pack As Collection
        Dim curInd As Long
        Dim accum_total, accum_max As Long

        Dim cur_val, cur_max As Long
        Dim total_val, total_max As Long
    End Structure

    '---------- Local variables ----------

    'Files & Folders
    Dim dataDir As String = System.IO.Directory.GetCurrentDirectory & "\HTML\"

    'Status
    Dim stat_check_obj_ind As Integer
    Dim stat_wb_complete As Integer

    'Progress
    Dim prg As struc_prg

    '---------- Local objects ----------
    Dim WithEvents wb_back As New WebBrowser



    Private Sub frm_main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim i, i2 As Integer

        '----- Variables -----

        'Status
        stat_wb_complete = 0

        'Size : Pack (@@@ Test @@@)
        prg.pack = New Collection
        Dim arrPack(,) = {{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
        For i = 0 To arrPack.GetUpperBound(0)
            For i2 = 0 To arrPack.GetUpperBound(1)
                prg.pack.Add(arrPack(i, i2))
            Next
        Next

        For i = 1 To prg.pack.Count / 3
            prg.accum_max += prg.pack.Item(i * 3 - 1)
        Next

        prg.curInd = 0

        '----- Form -----

        'Size
        Me.Size = New Size(704, 466)

        'Style
        Me.FormBorderStyle = 0
        Me.BackColor = Color.White

        '----- Sub -----

        'Build objects
        local_build_obj()

    End Sub

    Private Sub timer_check_obj_stat_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_check_obj_stat.Tick

        Dim flag As Boolean

        Select Case stat_check_obj_ind
            Case 1 'Web browser(Back)
                If wb_back.ReadyState = WebBrowserReadyState.Complete Then
                    flag = True
                    wb_back.Visible = True
                    stat_wb_complete = 1

                    local_new_pack() 'Test @@@

                End If
        End Select

        If flag Then timer_check_obj_stat.Enabled = False

    End Sub

    Private Sub timer_simul_prg_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_simul_prg.Tick
        'Test @@@

        Dim objArr(1) As Object

        Randomize()
        prg.cur_val += (Fix(50 * Rnd()) + 30)

        If prg.cur_val >= prg.pack.Item(prg.curInd * 3 - 1) Then
            prg.accum_total += prg.pack.Item(prg.curInd * 3 - 1)

            timer_simul_prg.Enabled = False
            local_new_pack()
            Exit Sub
        End If

        Randomize()
        timer_simul_prg.Interval = IIf(Fix(10 * Rnd()) = 0, 500, Fix(50 * Rnd()) + 1)

        'Set current progress
        objArr(0) = CObj(prg.cur_val) 'Value
        objArr(1) = CObj(prg.cur_max) 'Max

        local_wb_callScript("SetCurrentProgress", objArr)

        'Status
        objArr(0) = CObj(prg.pack.Item(prg.curInd * 3 - 2) & " 安裝中...(" & prg.cur_val & "/" & prg.cur_max & ")") 'Value

        local_wb_callScript("SetStatusText", objArr)


    End Sub



    Private Sub local_build_obj()

        Dim arrList As New List(Of Control)
        Dim arrSize As New List(Of Size)
        Dim arrPoint As New List(Of Point)
        Dim i As Integer

        arrList.Add(wb_back)
        arrSize.Add(New Size(688, 430))
        arrPoint.Add(New Point(0, 0))

        '--- Web browser ---
        For i = 0 To arrList.Count - 1
            arrList(i).Visible = False
            arrList(i).Parent = Me
            arrList(i).Size = arrSize(i)
            arrList(i).Location = arrPoint(i)
            wb_back.ScrollBarsEnabled = False
            'wb_back.ScriptErrorsSuppressed = True
        Next i

        'Write files
        Dim tempPath As String = dataDir & "133.html"
        My.Computer.FileSystem.WriteAllText(tempPath, My.Resources._133, False)

        'Navigate URL
        wb_back.Navigate("file://" & tempPath)
        local_new_objcheck(1)

        'Add handler
        AddHandler wb_back.Navigating, AddressOf local_event_wb_back_nav
        AddHandler wb_back.Document.Click, AddressOf local_event_wb_back_click

    End Sub

    Private Sub local_new_objcheck(ByRef ind As Integer)
        stat_check_obj_ind = ind
        timer_check_obj_stat.Enabled = True
    End Sub

    Private Sub local_event_wb_back_nav()
        If stat_wb_complete = 0 Then Exit Sub

        Select Case wb_back.Document.ActiveElement.Id
            Case "startGame"
                If wb_back.Document.GetElementById("agreement").GetAttribute("checked") = True Then
                    If wb_back.Document.InvokeScript("get_CanStart") = 1 Then
                        MsgBox("Game started.", MsgBoxStyle.Information, "Test")
                        End
                    End If
                End If
            Case "exitGame"
                If wb_back.Document.InvokeScript("get_CanStart") = 0 Then
                    If MsgBox("更新作業進行中.請問要結束嗎?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then
                        End
                    End If
                Else
                    End
                End If
            Case "closeGame"
                If wb_back.Document.InvokeScript("get_CanStart") = 0 Then
                    If MsgBox("更新作業進行中.請問要結束嗎?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then
                        End
                    End If
                Else
                    End
                End If
        End Select

    End Sub

    Private Sub local_event_wb_back_click()

        Select Case wb_back.Document.ActiveElement.Name
            Case ""
            Case "agreement"

        End Select

    End Sub

    Private Sub local_renew_finishprg()
        local_wb_callScript("OnAllDone", Nothing)
    End Sub

    Private Sub local_wb_callScript(ByRef s As String, ByRef objArr As Object)
        wb_back.Document.InvokeScript(s, objArr)
    End Sub


    Private Sub local_new_pack() 'Test @@@
        If prg.curInd = prg.pack.Count / 3 Then local_renew_finishprg() : Exit Sub

        Dim ObjArr(1) As Object

        prg.curInd += 1

        'Status
        ObjArr(0) = CObj("正在安裝" & prg.pack.Item(prg.curInd * 3) & "...")
        local_wb_callScript("SetStatusText", ObjArr)

        prg.cur_val = 0
        prg.cur_max = prg.pack.Item(prg.curInd * 3 - 1)

        'Reset total progress
        ObjArr(0) = CObj(prg.accum_total)
        ObjArr(1) = CObj(prg.accum_max)
        local_wb_callScript("SetTotalProgress", ObjArr)

        'Reset current progress
        ObjArr(0) = CObj(0)
        ObjArr(1) = CObj(prg.cur_max)
        local_wb_callScript("SetCurrentProgress", ObjArr)

        timer_simul_prg.Enabled = True

    End Sub


End Class


必須加入 Timer : timer_check_obj_stat (Interval = 100, Enabled=0) , timer_simul_prg (Interval = 1000, Enabled=0)

必須加入 Resource : _133 (Files)

必須在程式執行資料夾放上 HTML資料夾(可以從底下的附件中找到)



Resource : _133 如下,其中被我修改了一點點

Resource : _133 :

複製程式
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;" />
<title>Counter-Strike Online</title>
<style>
body {
  background-color : gray;
    margin : 0;
    padding : 0;
    font:12px Tahoma,Dotum,絡遺,Gulim,Verdana,sans-serif,serif;
}
.FrameBody {background-color: transparent}

img {border:0;}

#Wrapper01 {position:relative;width:688px;height:430px;background:url(bg01.jpg) no-repeat;}
#Wrapper02 {position:relative;width:688px;height:430px;background:url(bg02.jpg) no-repeat;}

  #NoticeFrame {position:absolute; left:8; top:185; width:671px; height:236px; z-index:3}

    #Install {position:absolute;top:145px;left:8px;width:671px;height:44px;}
        #BarTotalDiv {width:671px;height:6px;margin:0 0 0 0px;}
        #BarNowDiv {width:671px;height:6px;margin:5px 0 0 0px;}
        #InstallTxt {margin:6px 0 0 0;color:#FFFFFF;}
        #InstallTxt #InstallTxtPer {font-weight:bold;color:#C2B49A;float:right}
        
    .BtClose {position:absolute; left:673; top:6; width:13px; height:14px; z-index:3} 
    .BtClose a {width:13;height:14px;text-indent:-9000px;display:block;}
    #Wrapper01 .BtClose {background:url(close_n.jpg) no-repeat;}
    #Wrapper02 .BtClose {background:url(close_n.jpg) no-repeat;}
    
    .BtGamestart {position:absolute; left:419px; top:115; width:154px; height:28px; z-index:1} 
    .BtGamestart a {width:154px;height:28px;text-indent:-9000px;display:block;}
    .BtGamestart a:hover {width:154px;height:28px;text-indent:-9000px;display:block;}

    .BtGamestart_d {position:absolute; left:419px; top:115; width:154px; height:28px; z-index:1} 
    .BtGamestart_d a {width:154px;height:28px;text-indent:-9000px;display:block;}
    .BtGamestart_d a:hover {width:154px;height:28px;text-indent:-9000px;display:block;}

    #Wrapper01 .BtGamestart_d {background:url(start_d.jpg) no-repeat;}
    #Wrapper02 .BtGamestart_d {background:url(start_d.jpg) no-repeat;}
    
    #Wrapper01 .BtGamestart {background:url(start_n.jpg) no-repeat;}
    #Wrapper02 .BtGamestart {background:url(start_n.jpg) no-repeat;}
    #Wrapper01 .BtGamestart a:hover{background:url(start_o.jpg) no-repeat;}
    #Wrapper02 .BtGamestart a:hover{background:url(start_o.jpg) no-repeat;}
    
    .BtExit {position:absolute; left:585; top:115; width:93px; height:28px; z-index:2} 
    .BtExit a {width:93px;height:28px;text-indent:-9000px;display:block;}
    .BtExit a:hover {width:93;height:28;text-indent:-9000px;display:block;}
    #Wrapper01 .BtExit {background:url(exit_n.jpg) no-repeat;}
    #Wrapper02 .BtExit {background:url(exit_o.jpg) no-repeat;}

    .UserInfo{position:absolute;left:427px;top:63px;color:#c9f3ff;font:14px;} 
</style>
<script language="javascript">
<!--

var CanStart;

function SetNoticeUrl(url)
{
    document.getElementById("NoticeFrame").src = url;
    //alert(NoticeFrame.src);
}

function _onGameStart()
{
    
}

function get_CanStart()
{
    return CanStart
}

function _null() {}

function OnAllDone()
{
    var e = document.getElementById("startGame");

    if(agreement.checked)
    {
       e.parentElement.className = "BtGamestart";
       e.onclick = _onGameStart;
    }

    CanStart=1

    SetCurrentProgress(1, 1);
    SetTotalProgress(1, 1);

    lblStatus.innerText = "";
    InstallTxtPer.innerText = "更新完成,請點選開始遊戲按扭";
    //external.FlashWindow();
}

function checkAgreement()
{
   if(agreement.checked)
   {
      var barTotal = document.getElementById("barTotal");

      if(barTotal.width == 671)
      {
         var sb = document.getElementById("startGame");
         sb.parentElement.className = "BtGamestart";
         sb.onclick = _onGameStart;
      } 
   }
   else
   {
      var e = document.getElementById("startGame");
      e.parentElement.className = "BtGamestart_d";
      e.onclick = _null;      
   }
}

function SetTotalProgress(cur, total)
{
    //lblTotal.innerText = cur.toString() + "/" + total.toString();
    var lblTotal = document.getElementById("InstallTxtPer");
    if (lblTotal != null)
    {
        lblTotal.innerText = "進度 " + Math.round((cur/total * 100.0)) + "%";
    }
    var barTotal = document.getElementById("barTotal");
    if (barTotal != null)
    {
        barTotal.width = (cur/total) * barTotal.parentElement.offsetWidth;
    }
}

function SetCurrentProgress(cur, total)
{
    barCurrent.width = cur/total * barCurrent.parentElement.offsetWidth;
}

var g_output = "";
function Output(s)
{
    g_output += s + "<br>";
}
function SetStatusText(name)
{g_output
    //lblCurrent.innerText = name + " (" + cur + "/" + total + ")";
    lblStatus.innerText = name;
    //barCurrent.width = 0;
}
// -->
</script>
</head>

<body oncontextmenu="return false" onselectstart="return false;">
<script language="javascript">
<!--
var tag = '<div id="{0}">'
document.write(tag.replace('{0}', Math.random() < 0.5 ? 'Wrapper01' : 'Wrapper02'));
//-->
</script>
    <div id="Install">

        <div id="BarTotalDiv"><img id="barTotal" src="bar_total.gif" width="0%" height="6"></div>
        <div id="BarNowDiv"><img id="barCurrent" src="bar_now.gif" width="0%" height="6"></div>
        <div id="InstallTxt"><span id="InstallTxtPer">進度 0%</span><span id="lblStatus">Now Downloading...</span></div>
    </div>
    
    <span class="BtClose"><a href="javascript:_null()" id="closeGame">Close</a></span>
    <span class="BtGamestart_d"><a href="javascript:_null()" id="startGame">Start</a></span>
    <span class="BtExit"><a href="javascript:_null()" id="exitGame">Exit</a></span>
    <span class="UserInfo"><a href="http://tw.beanfun.com/cso/support_06.aspx" target="_blank">[遊戲服務合約書]</a></span>
    <span style="position:absolute;right:30px;top:63px;color:#ffffff;font:14px;"><input name="agreement" type="checkbox" value="0" onClick="checkAgreement()">我已閱讀並同意</span>
    <span style="position:absolute;right:30px;top:83px;color:#b4b4b4;">我已閱讀並同意遊戲服務合約書</span>
    
    <iframe src="http://tw.beanfun.com/cso/www/game_login.aspx" id="NoticeFrame" frameborder="0" width="100%" height="100%"  marginwidth="0" marginheight="0" scrolling="no" allowtransparency="true"></iframe>
    
</body>
</html>




可以下載看看,我已經把 進度列 等全部模擬完成

接下來你只要去修改 操控進度列的函數(在程式中),就能輕易達到更新的效果


不過這全拜 CSO 更新器是以 "HTML" 方式來執行所賜,所以在程式中,其實只用了一個 WebBrowser 而已

那些 Image 全部都是在 WebBrowser 裡面,因此位置、大小、觸發程序 都已經被 HTML碼設定好了

VB程式中只需要 攔截觸發,呼叫函數,還有判斷函數的值就行了,那些進度列的樣式都已經被設定好了,真方便


現在已經幾乎與 CSO 更新器一模一樣,只差進度列更新時不太一樣









CSOLauncher_Simulation 程式下載:

本帖包含附件
檔名: zip CSOLauncher_Simulation.rar   (2022-06-09 14:18 / 221 KB)   下載次數:32


獻花 x1
引用 | 編輯 n3ph223172
2011-08-10 12:59
7樓
  
下面是引用 ebolaman 於 2011-08-10 09:12 發表的 第二版 遊戲更新器 模擬: 到引言文
關於 VB.NET 好像是 VB 2005 的前身,這我也搞不太清楚
總之大家都習慣把 VB 分為兩階段,一個是 古老的 VB6 另外一個就是 VB.NET
至於該稱呼 VB.NET 還是 2005, 2008, 2010 這我就不知道



.......

感謝大大詳細的指導,在送上500元。
但您提到的"現在已經幾乎與 CSO 更新器一模一樣,只差進度列更新時不太一樣"
哪裡不一樣呢?
另外由於本人是個VB新手
因此大大提到的"必須加入 Timer : timer_check_obj_stat (Interval = 100, Enabled=0) , timer_simul_prg (Interval = 1000, Enabled=0)"
小弟不曉得加在哪裡…
而若依照大大的form底下的代碼:
會有以下錯誤:
複製程式
錯誤 1 Handles 子句需要 WithEvents 變數,該變數定義於包含型別或它的一種基底型別中。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 70 111 WindowsApplication1
錯誤 2 'timer_check_obj_stat' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 86 22 WindowsApplication1
錯誤 3 Handles 子句需要 WithEvents 變數,該變數定義於包含型別或它的一種基底型別中。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 90 106 WindowsApplication1
錯誤 4 'timer_simul_prg' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 101 13 WindowsApplication1
錯誤 5 'timer_simul_prg' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 107 9 WindowsApplication1
錯誤 6 'timer_check_obj_stat' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 162 9 WindowsApplication1
錯誤 7 'timer_simul_prg' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 239 9 WindowsApplication1


獻花 x0
引用 | 編輯 ebolaman
2011-08-10 13:51
8樓
  
下面是引用 n3ph223172 於 2011-08-10 12:59 發表的 Re:第二版 遊戲更新器 模擬: 到引言文
 
感謝大大詳細的指導,在送上500元。
但您提到的"現在已經幾乎與 CSO 更新器一模一樣,只差進度列更新時不太一樣"
哪裡不一樣呢?

介面已經完全一樣

就是更新時的文字 "檔案下載中..." "更新中" "解壓縮中..." 等文字不太一樣


複製程式
Dim arrPack(,) = {{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}

上面的模擬器我是用了這樣子 去稍微模擬

進度列是 用 Timer 去跑的,所以並不是真正的下載並安裝,還要改成你說的 FTP 下載

那些下載時說明的文字,就得要自己去打

你可以看看 CSOLauncher.exe 的資源檔的 String 部分,大概分為 下載、解壓縮、安裝、驗證 四個部分而已




還有,要操控 WebBrowser 中的進度列與狀態文字,用以下方法達成 (都能在上面回覆中的程式碼找到)

複製程式
        'Set total progress
        ObjArr(0) = CObj(prg.accum_total) '藍色桿子的 目前數值
        ObjArr(1) = CObj(prg.accum_max) '藍色桿子的 總數值
        local_wb_callScript("SetTotalProgress", ObjArr)

        'Set current progress
        ObjArr(0) = CObj(prg.cur_val) '灰色桿子的 目前數值
        ObjArr(1) = CObj(prg.cur_max) '灰色桿子的 總數值
        local_wb_callScript("SetCurrentProgress", ObjArr)

        'Set status
        ObjArr(0) = CObj("Installing...") '狀態文字
        local_wb_callScript("SetStatusText", objArr)


獻花 x1
引用 | 編輯 ebolaman
2011-08-10 14:00
9樓
  
直接給你 VB 2010 專案吧

本帖包含附件
檔名: zip CSO_Launcher_Simulation_(Include_VB_Project).rar   (2022-06-09 14:18 / 795 KB)  
| Filetype : RAR | CRC-32 : C02338D7
下載次數:24


獻花 x0
引用 | 編輯 n3ph223172
2011-08-10 16:52
10樓
  
 
下面是引用 ebolaman 於 2011-08-10 14:00 發表的 : 到引言文
直接給你 VB 2010 專案吧

再次感謝,開來看之後,發現原來我是少加入東西表情
        'Navigate URL
        wb_back.Navigate("file://" & tempPath)
        local_new_objcheck(1)
上面所指的file://是不是下載更新檔案的路徑?
另外再次請教,關於檔案判斷方面
此專案內裝也寫入嗎?
當FTP空間有此檔案,則檢查用戶自身電腦是否擁有該檔案以及大小是否正確
如果有該檔案,則檢查大小。
如果沒有該檔案,則下載。
如果皆符合,直接略過。

獻花 x0
引用 | 編輯 ebolaman
2011-08-10 17:14
11樓
  
這個 file:// 是連結到 WebBrowser 所使用的連結

你會發現 有一個資料夾 HTML,沒錯,WebBrowser 的網址是連到那個資料夾裡的 133.html

並非 檔案下載


複製程式
 'Write files
        Dim tempPath As String = dataDir & "133.html"
        My.Computer.FileSystem.WriteAllText(tempPath, My.Resources._133, False)

        'Navigate URL
        wb_back.Navigate("file://" & tempPath)
        local_new_objcheck(1)
[/pre]


關於 檔案判斷、FTP 下載 的部分,我完全沒做

你看到的進度列都是模擬出來的,所以還要再加上去 連上網路下載檔案的功能,現在只是 介面 的部分完成而已


關於 FTP 下載的部分,這裡有幾篇可以參考:

http://tw.myblog.yahoo.com/jw!t7pzMwuaAwLmvvVP5J4M/article?mid=2596

http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/63796964-f88a-40cf-91eb-08e71e98fa83/

http://www.codeproject.com/KB/IP/FtpClient.aspx?fid=225949&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=201


很抱歉我也是初學而已,對於 VB2010 種種的類型、宣告,還不是很熟悉

不過既然網路上範例與教學那麼多,只要研究一下應該是能做出來的

獻花 x0
引用 | 編輯 n3ph223172
2011-08-10 17:17
12樓
  
下面是引用 ebolaman 於 2011-08-10 17:14 發表的 : 到引言文
這個 file:// 是連結到 WebBrowser 所使用的連結
你會發現 有一個資料夾 HTML,沒錯,WebBrowser 的網址是連到那個資料夾裡的 133.html
並非 檔案下載

[code]
.......

哦,原來阿。
        Dim arrPack(,) = {{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
那請問當中的
{{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
裡面3引號分別指的是?

獻花 x0
引用 | 編輯 ebolaman
2011-08-10 17:51
13樓
  
下面是引用 n3ph223172 於 2011-08-10 17:17 發表的 : 到引言文
 
哦,原來阿。
        Dim arrPack(,) = {{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
那請問當中的
{{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
裡面3引號分別指的是?


Server Info, Map, Amxx, Plugin 是更新時所採用的 ID,就像身分證一樣,讓 更新程式知道即將要更新什麼
如果有來自 FTP 直接指示要更新哪個位置、哪個檔案 這樣更好

100, 3000, 888, 1999 是要更新的大小,當然是我亂打的

伺服器訊息, 地圖檔, 插件平台, 插件 是更新時要顯示的 狀態文字



當然最好的作法是,不要用這個陣列的方法,而是將更新的目錄儲存在 FTP 上,這樣萬一更新資料有變動,就不用再編輯 這個遊戲更新器,而是更新 FTP 上的更新目錄

獻花 x0
引用 | 編輯 n3ph223172
2011-08-10 21:51
14樓
  
下面是引用 ebolaman 於 2011-08-10 17:51 發表的 : 到引言文



Server Info, Map, Amxx, Plugin 是更新時所採用的 ID,就像身分證一樣,讓 更新程式知道即將要更新什麼
如果有來自 FTP 直接指示要更新哪個位置、哪個檔案 這樣更好

100, 3000, 888, 1999 是要更新的大小,當然是我亂打的

伺服器訊息, 地圖檔, 插件平台, 插件 是更新時要顯示的 狀態文字



當然最好的作法是,不要用這個陣列的方法,而是將更新的目錄儲存在 FTP 上,這樣萬一更新資料有變動,就不用再編輯 這個遊戲更新器,而是更新 FTP 上的更新目錄

感謝詳細解說。
基本上小弟就是想以這種方法更新。

小弟希望不是(xxxx/xxxx),而是XXXKB/s。
另外大大您的FTP文章小弟參考過了,小弟對於FTP這個是懂非懂。
有聽朋友說FTP只能下載單檔,是真的嗎?
小弟找到資料:http://ycc.tsu.edu.tw/S1/UpDownFile.htm
也是看的不怎麼懂…
總覺得跟小弟要弄的方法不一樣?

獻花 x0
引用 | 編輯 ebolaman
2011-08-10 22:32
15樓
  
下面是引用 n3ph223172 於 2011-08-10 21:51 發表的 : 到引言文
 
感謝詳細解說。
基本上小弟就是想以這種方法更新。
[attachment=768812]
小弟希望不是(xxxx/xxxx),而是XXXKB/s。
另外大大您的FTP文章小弟參考過了,小弟對於FTP這個是懂非懂。
有聽朋友說FTP只能下載單檔,是真的嗎?
小弟找到資料:http://ycc.tsu.edu.tw/S1/UpDownFile.htm
也是看的不怎麼懂…
總覺得跟小弟要弄的方法不一樣?


FTP 反正也只是不同地方的檔案,最難的就是 "如何取得檔案",之後判斷檔案、判斷要不要更新、檔案大小、狀態列文字 等都是很簡單的


抱歉我對 FTP 也是 完全不懂~

不過你可以給我 FTP 的網址,我來做看看

也請提供 狀態文字 要如何顯示(我看 CSO 的啟動器的狀態文字是分為 下載、解壓縮、安裝 大概這三階段,要做 XXXKB/s 應該是 OK),檔案要如何更新,FTP 帳密(可以創一個暫時測試用的)等更詳細的資訊。


還有我覺得更好的是以 Hash Code 來決定檔案是否要更新,如果單純判斷 檔案大小,尤其是檔案特別小,更新的時候卻又剛剛好檔案大小沒變,會造成沒有更新的錯誤,而 Hash Code 就沒這個問題

獻花 x1
引用 | 編輯 n3ph223172
2011-08-10 23:33
16樓
  
對不起!您沒有登入,請先登入論壇


獻花 x0
引用 | 編輯 ebolaman
2011-08-11 21:43
17樓
  
好了,下載檔案、檢查 Md5、解壓縮、複製檔案、呼叫遊戲、檢查重複程序 的功能都已經做好


GIF 動畫展示:





其中 ICSharpCode.SharpZipLib.dll,  MySharpZip.dll  這兩個 DLL 我沒辦法把他弄到 EXE 本身裡面,所以只好與 Launcher 放在同一個資料夾

預設的 FTP 是連線到 ftp://192.168.2.104 ,可以用你所提供的網頁中介紹的軟體 PCMan's FTP Server 來模擬本機的 FTP 下載,程式碼中可以修改

預設的 FTP 逾時是一分鐘,網頁逾時是半分鐘,可以調整




至於 FTP 上的資料夾,必須先建立個 CS_Update 資料夾,然後在底下置放一個索引文件 Index.txt

接著在 CS_Update 資料夾下就可以放置 cstrike 資料夾 (允許子資料夾),之後就能放更新的文件

但更新的文件必須全部是 zip 壓縮檔,並與原來檔名一樣(例如 cstrike.exe -> cstrike.exe.zip)


例如,檔案分配如下 (我設定本機的 FTP 指向 Desktop\TempFTP\  ):

複製程式
Index.txt    Desktop\TempFTP\CS_Update\Index.txt
mp.dll.zip    Desktop\TempFTP\CS_Update\cstrike\mp.dll.zip
temp.zip    Desktop\TempFTP\CS_Update\cstrike\temp.zip
test.zip    Desktop\TempFTP\CS_Update\cstrike\test.zip


index.txt 的內容:

複製程式
[Update]
"\cstrike\temp" 23677 MD5MD5MD5MD5MD5MD5MD5MD5MD5MD5MD
"\cstrike\mp.dll" 548 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
"\cstrike\test" 17760 715BD382F69BF50C6A4B3A05080AC3A4

[Remove]
"Test"

index.txt 的 [Update] 底下的,一開始是 檔案路徑,接著是 "壓縮檔" 的檔案大小,再來是 "解壓縮後檔案" 的 Md5,三個項目以空白鍵分開,檔案路徑必須被雙引號夾起來

"壓縮檔" 的檔案大小 是為了 顯示進度列,"解壓縮後檔案" 的 Md5 是為了檢查是否要更新


推薦的 Hash Codes 產生器/讀取器:

HashMyFiles  (其他還有 HashCalc, HashX, Hash Codes, Arpoon Checksum, ExactFile 等 Hash/Checksum 的免費軟體)





而更新的過程:

(1) 下載 Index.txt 知道更新的目錄 (索引清單)

(2) 開始檢查已經存在檔案的 Md5 並與索引清單對比,不相符的下載ZIP檔案 (下載到 %Temp%\ 中)

(3) 全部下載完後解壓縮 (在 %Temp%\ 中)

(4) 複製檔案(會覆蓋)到Launcher 本身資料夾底下的資料夾 (包含子資料夾)

(5) 刪除檔案 (只刪除 index.txt [Remove] 標頭底下提供的清單,這個設計到時候可能不需要,只是為了客戶端 檔案簡潔之用 (例:把舊的檔案刪除))


採用 ZIP 壓縮檔好處是能節省 下載時間,如果你覺得一個檔案一個檔案 壓縮成 ZIP 檔案很煩

可以用免費軟體  ArcThemAll 把選取的檔案一次 每個都加入到 個別的 ZIP 檔案

而新的資料我改存到 %Temp% 中,你可以在程式執行中在 %Temp% 下找到 CSOLnchr_Simu_XXX 的資料夾 (會在 Launcher 關閉時被刪除)




還有,我剛剛執行似乎有發現一個 BUG,就是 Launcher 本身可以重複啟動

其他功能請自行修改,我已經幫你完成幾乎所有部分了




CSOLauncher Simulation  VB 2010 專案下載:

Sorry this attachment is not available for download right now.

獻花 x1
引用 | 編輯 ebolaman
2011-08-11 22:20
18樓
  
關於 禁止Launcher 重複執行

請將 frm_main.vb 中的  Sub :  local_check_existExe 修改成

複製程式
    Private Sub local_check_existExe()

        'Check current process
        If (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1) Then Me.Close() : Exit Sub

        'Check game process
        If Process.GetProcessesByName(cFile.get_filename_major(exe.gameExe)).Length <> 0 Then local_show_errDlg("Err_exist_gameExe", exe.gameExe)

    End Sub


就可以防止重複執行程式了 (但不能防止 同時間 啟動) (P.S. 還有另外一種 Mutex 的方法)

獻花 x1
引用 | 編輯 n3ph223172
2011-08-11 22:39
19樓
  
下面是引用 ebolaman 於 2011-08-11 22:20 發表的 : 到引言文
關於 禁止Launcher 重複執行
請將 frm_main.vb 中的  Sub :  local_check_existExe 修改成
[code]
    Private Sub local_check_existExe()
        'Check current process
.......

原來如此,小弟了解了。
想必這份源碼一定能讓小弟進步許多^^!

獻花 x0
引用 | 編輯 ebolaman
2011-08-11 22:46
20樓
  
下面是引用 n3ph223172 於 2011-08-11 22:39 發表的 : 到引言文
 
原來如此,小弟了解了。
想必這份源碼一定能讓小弟進步許多^^!

沒想到一個啟動器竟會如此難做

寫這個專案也讓我自身進步不少,畢竟我以前都是在寫 VB6,很少碰 VB2010

這才發現 VB 2010 有很多很棒的設計,例如檔案處理部分用 My.Computer.FileSystem 底下的東西就能一行搞定


不過要做出那種  "複製中...剩餘 幾%"  還是要回歸基本的 buffer 讀取,而這個 Launcher 我沒這麼做,都是用一行搞定

缺點就是沒辦法用進度列來表示,檔案太大還會造成 視窗無回應

獻花 x0
引用 | 編輯 n3ph223172
2011-08-11 22:50
21樓
  
下面是引用 ebolaman 於 2011-08-11 22:46 發表的 : 到引言文


沒想到一個啟動器竟會如此難做

寫這個專案也讓我自身進步不少,畢竟我以前都是在寫 VB6,很少碰 VB2010

這才發現 VB 2010 有很多很棒的設計,例如檔案處理部分用 My.Computer.FileSystem 底下的東西就能一行搞定


不過要做出那種  "複製中...剩餘 幾%"  還是要回歸基本的 buffer 讀取,而這個 Launcher 我沒這麼做,都是用一行搞定

缺點就是沒辦法用進度列來表示,檔案太大還會造成 視窗無回應

小弟也有意願想碰VB6。
畢竟寫出來的東西不用配備高。
像2010寫出來的就得.NET 4.0..
許多朋友都沒到這麼高呢。

獻花 x0
引用 | 編輯 n3ph223172
2011-08-12 01:37
22樓
  
小弟請問下,若打包成rar可以下載嗎?

獻花 x0
引用 | 編輯 ebolaman
2011-08-12 08:37
23樓
  
下面是引用 n3ph223172 於 2011-08-12 01:37 發表的 : 到引言文
小弟請問下,若打包成rar可以下載嗎?

似乎已經有很多人做好了,有直接呼叫 RAR 來解壓縮的:

http://www.kodyaz.com/articles/how-to-unrar-rar-files-using-vb.net-extract-code.aspx


有用本身的 Class 來解壓縮的:

http://www.vbforums.com/showthread.php?t=530685



改成 RAR 的話可以,但是程式碼必須修改

獻花 x0
引用 | 編輯 ebolaman
2011-08-12 12:43
24樓
  
這次改成了呼叫 WinRAR 來解壓縮

缺點是,不知道沒裝 WinRAR 的人能不能解壓縮,不過應該都會有吧,不然當初怎麼下載遊戲的

另外原本需要的兩個 DLL 現在也不用了



另外我還做了一個小程式,叫作 Find And RAR

把這個小程式放在 FTP 目錄下,然後執行,就能將每個檔案,分別 壓縮起來 (RAR型式,且包含副檔名)

可以方便 FTP伺服端 檔案的操作

本帖包含附件
檔名: zip CSOLauncher_Simulation.rar   (2022-06-09 14:18 / 1007 KB)  
CSOLauncher Simulation V3
下載次數:17 需要威望:70

本帖包含附件
檔名: zip Find_and_RAR.rar   (2022-06-09 14:18 / 47 KB)  
Find and RAR
下載次數:11


獻花 x1
引用 | 編輯 n3ph223172
2011-08-12 23:48
25樓
  
下面是引用 ebolaman 於 2011-08-12 12:43 發表的 CSOLauncher Simulation 第三版: 到引言文
這次改成了呼叫 WinRAR 來解壓縮

缺點是,不知道沒裝 WinRAR 的人能不能解壓縮,不過應該都會有吧,不然當初怎麼下載遊戲的

另外原本需要的兩個 DLL 現在也不用了



另外我還做了一個小程式,叫作 Find And RAR

把這個小程式放在 FTP 目錄下,然後執行,就能將每個檔案,分別 壓縮起來 (RAR型式,且包含副檔名)

可以方便 FTP伺服端 檔案的操作

真的太感謝了,小弟真的第一次遇到像大大這麼熱心也這麼用心的人。
小弟再試試第三版在向大大反應!^^

獻花 x0
引用 | 編輯 n3ph223172
2011-08-13 01:21
26樓
  
小弟測試後,卻發生這樣的問題…
小弟不明哪裡作錯了…


獻花 x0
引用 | 編輯 ebolaman
2011-08-13 09:10
27樓
  
下面是引用 n3ph223172 於 2011-08-13 01:21 發表的 : 到引言文
小弟測試後,卻發生這樣的問題…
小弟不明哪裡作錯了…
[attachment=769144]

有可能是 FTP連線出錯 (位址不正確、帳密不正確,有的帳號必須加入 @XXXX)

或是找不到 FTP端 的檔案 (Index.txt 內容錯誤)



如何偵錯:

在 [Class] >> cls_net.vb >> Function ftp_download

最底下的  Err_1:  下加上  MsgBox(Err.Description)


改成這樣,然後再執行一次

複製程式
Err_1:
        MsgBox(Err.Description)
        Return Err.Number



P.S. 我明天到下禮拜天都會不在,到時候可能要你自己研究一下了..

獻花 x0
引用 | 編輯 n3ph223172
2011-08-13 13:00
28樓
  
下面是引用 ebolaman 於 2011-08-13 09:10 發表的 : 到引言文


有可能是 FTP連線出錯 (位址不正確、帳密不正確,有的帳號必須加入 @XXXX)

或是找不到 FTP端 的檔案 (Index.txt 內容錯誤)



如何偵錯:

在 [Class] >> cls_net.vb >> Function ftp_download

最底下的  Err_1:  下加上  MsgBox(Err.Description)


改成這樣,然後再執行一次

複製程式
 
Err_1: 
        MsgBox(Err.Description) 
        Return Err.Number 


P.S. 我明天到下禮拜天都會不在,到時候可能要你自己研究一下了..

測試後:

請問是要連同TempFTP資料夾放進去,還是放CS_Update進去即可?
小弟僅將大大您的源碼資料夾內附的測試檔案上傳至FTP空間。
所有東西並未修改過
包含Index.txt
但同時小弟覺得大大填的MD5碼怪怪的,是不是跟無法取得的問題是不是相連的?

獻花 x0
引用 | 編輯 n3ph223172
2011-08-13 13:43
29樓
  
解決了
小弟請另外一位朋友協助,後來是"I"ndex.txt檔名的問題

獻花 x0
<< 1 2 3 >>
跳頁: (共 3 頁)