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
>msLocDir & vbNullChar
>msFtpDir & vbNullChar
『& vbNullChar』のおまじないは要らないのでは。
ねろさんレス有難うございます。
しかし『& 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
で定義されているものもありましたが・・・。
単純に
msFtpDir = "F:\FTPTEST"
じゃなくて
msFtpDir = "F:\FTPTEST\trancefile.txt"
のような気が?
36NETさんレス有難う御座います。
試してみたのですが、同様のエラーが返ってきて失敗でした。
msFtpDirはIISで設定したFTPフォルダのカレントディレクトリです。
ちなみにコマンドプロンプトではPUTが成功しているので
FTPの設定は出来ているのですが・・・。
WindowsのFtpサーバっていじったことないんで憶測ですが
コマンドプロンプトでログインして"F:\FTPTEST"に移動し
pwdコマンド発行するとカレントはなんて表示されてます?
"F:\FTPTEST"じゃなかったらプログラム中の"F:\FTPTEST"の
個所をそれに書き換えるとか?
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
私もFTPは初めてなので知識が乏しいです。
pwdコマンドを発行したら、
257 "/" is current directory
と表示されましたが。
>"F:\FTPTEST"に移動し
というのが良く分からないので実施していませんが
カレントディレクトリなので移動する必要がないと
思われますが、どうなんでしょうか?
その場合
msFtpDir = "F:\FTPTEST"
を
msFtpDir = "/trancefile.txt"
っと変更してみてください
"F:\FTPTEST"はあくまでもサーバ上のパスであって
例え[共有フォルダ]
マシンAで"C:\temp"を共有した場合
マシンBからは"\\A\temp"で参照する
みたいなもの!?
>msFtpDir = "/trancefile.txt"
で出来ました。
36NETさん有難う御座いました。
ツイート | ![]() |