使用の停止(?)

タグの編集
投稿者 大初心者  (中学生) 投稿日時 2013/11/16 22:40:11
例えば バージョンアップ(?)で前回作ったのを最新に変えてもらえるように
最新ができた時に前作にメッセージを出して 使えなくさせる(?)ことってできますか?
またできるなら、名前の通り 本当に大初心者なので 必要な物(Buttonなど)と コード を
言っていただけると、とても嬉しいです。
投稿者 shu  (社会人) 投稿日時 2013/11/17 08:20:23
前作というのが既に出来上がっているものでそのような仕組みが
ない場合、動かなく出来る可能性があるとしたらサーバーへのアクセスを
行っていることです。サーバー側の受け付ける入力または返還する戻りデータの
形式を変更してしまえばエラーとなり前作は動作しなくなります。

前作というのがこれから作るものであったとしてもクライアントだけで閉じている
ものであったらこの仕組みは難しいです。少なくとも起動時にサーバーへのアクセスを
してバージョンチェックを行う必要があります。
投稿者 大初心者  (中学生) 投稿日時 2013/11/17 16:59:04
それを行うにはどういった準備をすればいいですか?
投稿者 nin  (社会人) 投稿日時 2013/11/18 12:56:47
なかなかあきらめない回答いいですね・・・。
で、素人ジジイながら、考えてみました

大初心者様もインターネットをされているので、プロパイダ契約されて
いると思います。通常、メールと、ホームページのエリアが付属で付いて
いると思います
ホームページのエリアに更新情報を置いて、プログラム起動時に、チェック
するようにします
通信手段としては、ホームページのアクセスで使う、HTTPプロトコロルか
データのアップダウンで使う、FTPプロトコロルかのどちらかを利用する
ことになります。(HTTPのほうが、ブロックされにくいので、問題は少ない
と思います)

一応FTPでの手順では、以下のような感じです
更新情報を一旦ファイルとしてダウンロードしてから開いています
多分、一旦ファイルにしなくてもいいように思いますが、その編は、詳しく
ありません。

ftpで通信できる環境があるのでしたら、まず、フリーのftpツールを使って
通信できるか確認してください

バージョン情報を記載したファイル

version.txt を準備します
中身は、数字のみ (数字の1~)

   Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim FTPEr as Integer

    FTPEr = Ftpdl("version.txt","version.txt")
    
    IF FTPEr = 0 Then
    
 'ダウンロードファイルを読み込みます
        If System.IO.File.Exists(Application.StartupPath + "\version.txt") Then
            Dim Reader As New IO.StreamReader(Application.StartupPath + "\version.txt")
            Dim version as Integer = Reader.ReadLine
            Reader.Close()
            
            If version >現在のバージョン Then 
               MsgBox("最新バージョンが存在します")       
               起動させない情報を入れる
            End if
         Else
            MsgBox("ファイルが存在しません")
        End If
 

    Else
    Msgbox("ダウンロードエラーです")

    End If


    End Sub

   Private Function Ftpdl(ByVal FileNam As String, ByVal LFileNam As String) as Integer


        Dim UserName As String = "ログインユーザ名"
        Dim UserPass As String = "ログインパスワード"
        Dim ServerName As String = "ftp://xxxxx あなたのホームページのアドレス" & FileNam
       
        Dim u As Uri
        u = New Uri(ServerName)
        'ダウンロードしたファイルの保存先
        Dim downFile As String = Application.StartupPath + "\" + LFileNam

        'FtpWebRequestの作成
        Dim ftpReq As System.Net.FtpWebRequest = _
            CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest)
        'ftpReq.ReadWriteTimeout = Val(Form1.TextBox18.Text)
        'ftpReq.Timeout = Val(Form1.TextBox19.Text)
        'ログインユーザー名とパスワードを設定
        ftpReq.Credentials = New System.Net.NetworkCredential(UserName, UserPass)
        'MethodにWebRequestMethods.Ftp.DownloadFile("RETR")を設定
        ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
        '要求の完了後に接続を閉じる
        ftpReq.KeepAlive = True
        'ASCIIモードで転送する
        ftpReq.UseBinary = False
        'PASSIVEモードを無効にする
        ftpReq.UsePassive = True
        On Error GoTo nuke
        'FtpWebResponseを取得
        Dim ftpRes As System.Net.FtpWebResponse = _
            CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)
        'ファイルをダウンロードするためのStreamを取得
        Dim resStrm As System.IO.Stream = ftpRes.GetResponseStream()
        'ダウンロードしたファイルを書き込むためのFileStreamを作成
        Dim fs As New System.IO.FileStream( _
            downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write)
        'ダウンロードしたデータを書き込む
        Dim buffer(1023) As Byte
        While True
            Dim readSize As Integer = resStrm.Read(buffer, 0, buffer.Length)
            If readSize = 0 Then
                Exit While
            End If
            fs.Write(buffer, 0, readSize)
        End While


        fs.Close()
        resStrm.Close()

         '閉じる

        ftpRes.Close()
        ErrFTP = 0
Return ErrFTP
        Exit Sub
nuke:
        ErrFTP = 1
Return ErrFTP

    End Sub
投稿者 るきお  (社会人) 投稿日時 2013/11/18 13:13:46
前提を確認させてください。

>例えば バージョンアップ(?)で前回作ったのを最新に変えてもらえるように
>最新ができた時に前作にメッセージを出して 使えなくさせる(?)ことってできますか?
前作も最新の両方残しておきたいけど、前作の方を起動した場合はメッセージを出してそれ以上は動作しないようにしたい。
ということでしょうか?

単純に、新作が出るたびに前作を上書きすればよいのであればインストーラーである程度制御可能だと思います。
この方法では通常のユーザーは何の問題もありませんが、パソコンに詳しいユーザーは上書きを回避して前作と新作の両方を使えるようにするということができてしまう場合があります。
投稿者 大初心者  (社会人) 投稿日時 2013/11/20 16:28:34
すいません><
初めて作るので1つしっかりとしたのを作っとけば今後がうまく進むようにしたいので><
1つめはどうしてもしっかりと作っておきたいんです><

FFFTPをダウンロードしてきました FC2に登録し接続を確認しました
Version.txt には何を入れればいんでしょうか?
またどこに配置すればいいんでしょうか?

作成していただいた codeはForm1にいれればいいんでしょうか?
Form1に入れる場合前回のパスワード認証+作成していただいたのでいいんでしょうか?(問題ないでしょうか?

本当に質問が多く迷惑をかけてしまい... すいません><
投稿者 nin  (社会人) 投稿日時 2013/11/20 21:34:21
一応前提は、起動時に最新バージョンがあるかを確認し、あれば、メッセージを表示し、起動させない
とのことで、続き回答します

Version.txt の中身は、現状のバージョンの数字です。1から順番に番号を増やします
サーバ上のVersion.txtをダウンロードして、現在のバージョン数字と比較します
例えば、Version.txtの中身が、数字の2として、起動しているプログラムのバージョンが1だとしたら、
If version >1 Then 
の部分で、2>1 で新しいバージョンがあることが判断できます
作成したコードは、form1に記述してください
 起動させない情報を入れる  のところで、例えば、kidousasenai = 1 とセットします
ログインボタンのところで、
If kidousasenai = 1 then Exit Sub 
プログラムを抜けさせて、ログイン動作を行わせないようにします

ただ、インターネットにつながらない場合(Version.txtを取得できない場合)は、どうするのかは
判断してください

kidousasenai の変数の宣言は、Form1_Loadと、buttonの両方で使うので、

Dim kidousasenai as Integer
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim FTPEr as Integer

外側の部分に記述します(表現の仕方がわかりません)
こちらも素人なので、ベストな方法かどうかは、なんともです
ではでは がんばってください
投稿者 nin  (社会人) 投稿日時 2013/11/20 23:28:07
何処に配置するかの回答ぬけていました。
ホームページエリアに、フォルダ /data を作ってその配下に配置します
FFFTPのツールを使ってフォルダ作成及び、version.txtをアップロードします
"ftp://xxxxxx.xxxx/data/"&
投稿者 大初心者  (社会人) 投稿日時 2013/11/29 18:42:02
返信遅れてすみません><;

配置して起動する時に
型 'System.Net.HttpWebRequest' のオブジェクトを型
'System.Net.FtpWebRequest' にキャストできません。 
と表示され、詳細.実行.終了 の選択がでますがどうすればいいんでしょうか?...
投稿者 nin  (社会人) 投稿日時 2013/12/1 12:52:46
ん~ HttpWebRequest どこにも使ってないのに、・・・。どの行でエラーになるか判りますですしょうか?

あと、パスワード認証の質問のところで、FTPではなく、HTTPでの方法を回答しています。
今回、FTPを使う必要性がないので、HTTPのほうがいいかと思います
書き直すと、以下のような感じです

Form2を、バージョンを判断して起動させます


    Dim kidousasenai As Boolean

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        If kidousasenai Then MsgBox("最新バージョンが存在する為起動できません") : Exit Sub
        Form2.Show()

    End Sub

    Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load

        'httpで、ファイルをダウンロード 
        Dim wci As New System.Net.WebClient()
        Dim wcp As New System.Net.WebClient()
        Try
            wci.DownloadFile("http://あなたのサーバ名/data/version.txt", Application.StartupPath + "\version.txt")

        Catch
            MsgBox("ダウンロードエラーです")
        End Try

        wci.Dispose()

        'バージョン確認処理 
        If System.IO.File.Exists(Application.StartupPath + "\version.txt"Then
            Dim Reader As New IO.StreamReader(Application.StartupPath + "\version.txt")
            Dim version As Integer = Reader.ReadLine
            Reader.Close()

            If version > 1 Then
                MsgBox("最新バージョンが存在します")
                kidousasenai = True
            End If
        Else
            MsgBox("ファイルが存在しません")
        End If

    End Sub