inetを使用してのFTP


WAKO  2004-05-28 10:24:51  No: 83603  IP: [192.*.*.*]

INET を使用してFTPをしているのですが、
わざとエラーがでるように設定していて、エラーメッセージの内容
を確認していますが、いつも
VB ERRNUMBER 35764 "最後の要求が実行中です。"
とでるのですが、どういう意味か分かりますか。
分かる方教えて下さい。

編集 削除
魔界の仮面弁士  2004-05-28 17:40:02  No: 83604  IP: [192.*.*.*]

『最後の要求』が実行中というエラーは、
『前回の命令(ファイルのダウンロードやアップロードなど)』が
完了していないのに、次の命令が要求されたという事を意味します。

StateChangedイベント等について調べてみてください。

編集 削除
WAKO  2004-05-28 18:30:44  No: 83605  IP: [192.*.*.*]

ファイル転送もできていないのに、"ファイル転送が
成功しました。" というメッセージがでます。

INET を使用してのFTPのやり方ですが
以下でいいでしょうか。

'** inet 接続
With Inet1
.URL = "ftp://" & wURL
.RequestTimeout = wTIMEOUT
.UserName = wUSER
.Password = wPASS
.Execute , "Ascii"
.Execute , "put " & wkFile & " " & wID & Format(Now, "YYYYMMDDhhmmss")
Do While .StillExecuting = True
   DoEvents
Loop

.Execute , "close"
.Execute , "QUIT"

End With


'** inet 解除
Inet1.Cancel
MsgBox "ファイル転送が成功しました"

Private Sub Inet1_StateChanged(ByVal State As Integer)

    Dim vntgetdata As Variant   '受信データ

    'データ(コマンド結果)を取得する
    If State = icResponseCompleted Then
       vntgetdata = Inet1.GetChunk(1256, icString)
       MsgBox vntgetdata
    End If

End Sub


これだと不安です。
正しいかだれかわかりますか。
もし、おかしい場所があれば教えて下さい。

編集 削除
魔界の仮面弁士  2004-05-29 16:40:10  No: 83606  IP: [192.*.*.*]

> Do While .StillExecuting = True
>    DoEvents
> Loop
それは、StateChangedイベントを使わない時の待機方法です。
空ループ処理にもCPUは消費しますので、イベントで制御するならば、
ループは行わない方が良いと思います。

> vntgetdata = Inet1.GetChunk(1256, icString)
Inetコントロールは、ASCIIモードに対応していないそうです。
icStringではなく、icByteArrayで取得した方が良いかも知れません。

また、そのコードでは、最大でも1256バイト分のチャンクしか取得できません。
GetChunkの戻り値が空になるまで、繰り返しGetChunkするようにしてみてください。

編集 削除
WAKO  2004-05-30 20:55:43  No: 83607  IP: [192.*.*.*]

魔界の仮面弁士 さん
返答ありがとうございます。
VBのINETを使用するのは、本当に素人ですので、
以下の所をどのように書き換えたら
よろしいでしょうか。
また、CLOSEの書く場所は、正しいと思いますか。
ファイル転送もできていないのに、
成功しました。とでるのは、CLOSEの書く場所
が違うからではないでしょうか。
すみませんが、分かりますでしょうか。


> Do While .StillExecuting = True
>    DoEvents
> Loop
それは、StateChangedイベントを使わない時の待機方法です。
空ループ処理にもCPUは消費しますので、イベントで制御するならば、
ループは行わない方が良いと思います。

編集 削除
ねろ  2004-05-31 11:35:40  No: 83608  IP: [192.*.*.*]

個人的な意見として、Inetはやめておいた方がいいと思いますが、どうしてもと言うなら。
With Inet1
    .URL = "ftp://" & wURL
    .RequestTimeout = wTIMEOUT
    .UserName = wUSER
    .Password = wPASS
    .Execute , "put " & wkFile & " " & wID & Format(Now, "YYYYMMDDhhmmss")
End With

Private Sub Inet1_StateChanged(ByVal State As Integer)
    Dim tData As Variant ' データを入れる変数。
    Dim sData As String
    Debug.Print State    '状態を書き出す
    Select Case State
        Case icResponseCompleted
            Do
                tData = Inet1.GetChunk(1024, icString)
               sData = sData & tData
      Loop While (Len(tData) <> 0)
            Text1.Text = sData
    End Select
End Sub
とでもして、イミディエイトウィンドウとMSDNのStateChangedのヘルプのState の値を
見ながらデバッグしたらいかがですか。
とりあえずCLOSEは
Private Sub Command2_Click()
    Inet1.Execute "CLOSE"
End Sub
とでもして。
WinInetの方が「吉」ですよ。

編集 削除
WAKO  2004-05-31 12:23:09  No: 83609  IP: [192.*.*.*]

返答ありがとうございます。
INETじゃないとだめという事はまったくありません。
すいません初心者なので、
WinInet ではどのように書くのですか
お手数だと思いますが教えていただけないでしょうか。
よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-05-31 13:09:56  No: 83610  IP: [192.*.*.*]

FTPによる同期通信には、basp21 がお奨めです。
ログ出力機能も実装されていますし、VBからの扱いも簡単かと。
http://www.hi-ho.ne.jp/babaq/basp21.html  (Free版 BASP21.DLL)
http://www.b21soft.co.jp/basp21/     (製品版 BASP21 Pro)

外部コンポーネントを使ってはいけないのであれば、
ねろさんの回答にある WinInetという選択肢もあります。
google等で検索すると、WinInetのサンプルも見つかるでしょう。

編集 削除
ねろ  2004-05-31 13:14:48  No: 83611  IP: [192.*.*.*]

ここにサンプルコードが有ります。
http://support.microsoft.com/default.aspx?scid=kb;ja;175179
http://www.galliver.co.jp/writing/susume_vb/tre902/
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/0003/api/

編集 削除