WinInetを用いたFtpPutFileについて

解決


PUT  2005-05-13 20:29:22  No: 121629

VBを始めて1ヶ月の者です。
WinInetを用いたFtpPutを実行したいのですが、
connectまでは成功している、putが成功しません。
FtpPutFile直後にErr.LastDllErrorでエラーを参照したところ
「12003」というエラー値が返ってきました。
現在、このエラー値の原因をWebで調べているのですが
なかなか結論にはいたりません。

VBに詳しい方、是非アドバイスをください。
またソースの一部を下記に記述しますので、APIの宣言等で
誤りがあったら教えて頂けると助かります。

宜しくお願い致します。

※開発環境はクライアント:Win2000、FTPサーバ:Win2003サーバ、VB6.0です。

Private Declare Function FtpPutFile Lib "WinInet.DLL" _
       Alias "FtpPutFileA" _
       (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _
       ByVal lpszNewRemoteFile As String, ByVal dwFlags As Long, _
       ByVal dwContext As Long) As Long

Public Function FtpDataput()

    On Error GoTo FTPDATAGETINI_ERR

    Dim lngInethnd    As Long    'InterNet Open Handle
    Dim lngFtphnd     As Long    'InterNet Connect Handle
    Dim lngRet        As Long    '戻り値
    Dim strFtpSvrIP   As String  'IP
    Dim msFtpUid      As String  'ID
    Dim msFtpPwd      As String  'PASS
    Dim msLocDir      As String  'ローカルパス
    Dim msFtpDir      As String  'リモートパス

    On Error GoTo FTPDATAGETINI_ERR

    strFtpSvrIP = "×.×.×.×"
    msFtpUid = "Administrator"
    msFtpPwd = "admin"
    msLocDir = "E:\TEST\trancefile.txt"
    msFtpDir = "F:\FTPTEST"

    'InternetOpen (Handle を取得)  インターネットへの接続します
    lngInethnd = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, _
                              vbNullString, vbNullString, 0)
                                            
    'InternetConnect (上記で取得した Handle で FTP Server に Connect)
    'サーバーに接続、ハンドルを返す
    lngFtphnd = InternetConnect(lngInethnd, strFtpSvrIP, INTERNET_DEFAULT_FTP_PORT, _
                                msFtpUid, msFtpPwd, INTERNET_SERVICE_FTP, 0&, 0&)

    'FTP ServerにファイルをPUTする
    lngRet = FtpPutFile(lngFtphnd, msLocDir & vbNullChar, msFtpDir & vbNullChar, _
                        FTP_TRANSFER_TYPE_ASCII, 0)

    ret = MsgBox(Err.LastDllError, vbInformation, "情報")

    lngRet = InternetCloseHandle(lngFtphnd)
    lngRet = InternetCloseHandle(lngInethnd)

Exit Function

FTPDATAGETINI_ERR:

    'InternetConnect がされた後なのか判断
    If lngFtphnd <> 0 Then
        'Internet Handle Close 処理
        lngRet = InternetCloseHandle(lngFtphnd)
    End If

    End

End Function


ねろ  2005-05-13 20:59:03  No: 121630

>msLocDir & vbNullChar
>msFtpDir & vbNullChar
『& vbNullChar』のおまじないは要らないのでは。


PUT  2005-05-13 22:26:35  No: 121631

ねろさんレス有難うございます。
しかし『& vbNullChar』を省略しても結果は同じでした。

API宣言は間違ってないですよね!?
Webによっては

Private Declare Function FtpPutFile Lib "WinInet.DLL" _
       Alias "FtpPutFileA" _
       (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _
       ByVal lpszNewRemoteFile As String, ByVal dwFlags As Long, _
       ByVal dwContext As Long) As Boolean

で定義されているものもありましたが・・・。


36NET  2005-05-13 22:46:08  No: 121632

単純に
msFtpDir = "F:\FTPTEST"
じゃなくて
msFtpDir = "F:\FTPTEST\trancefile.txt"
のような気が?


PUT  2005-05-13 22:56:03  No: 121633

36NETさんレス有難う御座います。
試してみたのですが、同様のエラーが返ってきて失敗でした。
msFtpDirはIISで設定したFTPフォルダのカレントディレクトリです。
ちなみにコマンドプロンプトではPUTが成功しているので
FTPの設定は出来ているのですが・・・。


36NET  2005-05-13 23:39:43  No: 121634

WindowsのFtpサーバっていじったことないんで憶測ですが
コマンドプロンプトでログインして"F:\FTPTEST"に移動し
pwdコマンド発行するとカレントはなんて表示されてます?
"F:\FTPTEST"じゃなかったらプログラム中の"F:\FTPTEST"の
個所をそれに書き換えるとか?


ななし  2005-05-13 23:46:01  No: 121635

http://www.microsoft.com/japan/developer/library/vidref/dvmsgerrormessages.htm
>12003 ERROR_INTERNET_EXTENDED_ERROR
>拡張エラーがサーバーから返されました。これは通常、文字列またはバッファ
>にエラー メッセージの詳細が含まれていることを示します。>InternetGetLastResponseInfo を呼び出して、エラー テキストを
>取得してください。 
とのことなのでメッセージを確認してみては?

IISのようなので関係ないかもしれませんが
「WinInet FTP API がエラー12003 を返す場合」
http://support.microsoft.com/kb/168492/ja


PUT  2005-05-13 23:49:51  No: 121636

私もFTPは初めてなので知識が乏しいです。
pwdコマンドを発行したら、
257 "/" is current directory
と表示されましたが。

>"F:\FTPTEST"に移動し
というのが良く分からないので実施していませんが
カレントディレクトリなので移動する必要がないと
思われますが、どうなんでしょうか?


36NET  2005-05-13 23:57:47  No: 121637

その場合
msFtpDir = "F:\FTPTEST"

msFtpDir = "/trancefile.txt"
っと変更してみてください

"F:\FTPTEST"はあくまでもサーバ上のパスであって
例え[共有フォルダ]
マシンAで"C:\temp"を共有した場合
マシンBからは"\\A\temp"で参照する
みたいなもの!?


PUT  2005-05-14 00:08:00  No: 121638

>msFtpDir = "/trancefile.txt"
で出来ました。
36NETさん有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加