WinInetを用いたFtpPutFileについて

解決


PUT  2005-05-13 11:29:22  No: 121629  IP: [192.*.*.*]

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 11:59:03  No: 121630  IP: [192.*.*.*]

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

編集 削除
PUT  2005-05-13 13:26:35  No: 121631  IP: [192.*.*.*]

ねろさんレス有難うございます。
しかし『& 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 13:46:08  No: 121632  IP: [192.*.*.*]

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

編集 削除
PUT  2005-05-13 13:56:03  No: 121633  IP: [192.*.*.*]

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

編集 削除
36NET  2005-05-13 14:39:43  No: 121634  IP: [192.*.*.*]

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

編集 削除
ななし  2005-05-13 14:46:01  No: 121635  IP: [192.*.*.*]

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 14:49:51  No: 121636  IP: [192.*.*.*]

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

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

編集 削除
36NET  2005-05-13 14:57:47  No: 121637  IP: [192.*.*.*]

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

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

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

編集 削除
PUT  2005-05-13 15:08:00  No: 121638  IP: [192.*.*.*]

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

編集 削除