WinInetを使用したFTPについて


かつお  2004-01-16 20:22:08  No: 81510  IP: [192.*.*.*]

[OSのVER]:Windows2000
[VBのVER]:6.0

始めまして。
FTPを使用してWindowsからAS/400のデータをget/putする際に、
漢字やカナが化けてしまうことを回避するために、以下のようなサブコマンドで対処します。

ftp> quote type c 932

現在VB6.0をにて、WinInetを使用を使用してAS400にファイル転送を行う仕組みを作成したいと
考えております。WinInetでは、quote type c 932のようなFTPのサブコマンドを扱うことが可能でしょうか?
教えていただけないでしょうか。宜しくお願いいたします。

以下のように単にASCIIモードで転送した場合には、AS400側で化けてしまいます。

FtpPutFile(hFtpSession,localFile,RemoteFile,INTERNET_FLAG_TRANSFER_ASCII,0)

編集 削除
魔界の仮面弁士  2004-01-16 20:25:09  No: 81511  IP: [192.*.*.*]

FTPCommand APIを使えば、quoteコマンドの送出が可能です。

編集 削除
かつお  2004-01-19 10:33:20  No: 81512  IP: [192.*.*.*]

魔界の仮面弁士様、どうもありがとうございます。

FTPCommand APIですが、これはWindows CEのみでサポートされている
ものではないかと思うのですが。Helpによりますと、

At a Glance
Header file: Wininet.h 
Module: Wininet 
Platforms: Palm-size PC 
Windows CE versions: 2.0 and later 

と記述されています。

Tryしてみましが、だめでした。

編集 削除
魔界の仮面弁士  2004-01-19 11:02:22  No: 81513  IP: [192.*.*.*]

CE専用ではありません。IE5やIE6環境でも利用できますよ。
実際4年前、AS/400システム相手に、Access 97からFTPCommandを
呼び出して利用した経験もありますし。(^^;

> Tryしてみましが、だめでした。
CE版の同名関数は引数が5個ですが、PC版の引数は6個です。
間違ってCE版の宣言を行っていないか、もう一度ご確認ください。

編集 削除
かつお  2004-01-19 12:37:29  No: 81514  IP: [192.*.*.*]

Dim lnghConnect           As Long
Dim hFile                 As Long
Dim strCommand            As String


strCommand = "QUOTE TYPE C 932"

'InternetConnectで取得できたハンドルを使用して、

bRet = FtpCommand(lnghConnect, _
                  False, _
                  FTP_TRANSFER_TYPE_ASCII, _
                  strCommand, _
                  0, _
                  hFile)

を呼び出しますと、bRet = 0で、
InternetGetLastResponseInfo dwIntError, vbNullString, dwLength
strBuffer = String(dwLength + 1, 0)
InternetGetLastResponseInfo dwIntError, strBuffer, dwLength

でエラーメッセージを確認しましたところ、
500 SUBCOMMAND QUOT NOT VALID.
が返されます。

コマンドプロンプトからFTPを起動した場合は問題なくこのサプコマンドは
転送されます。

以上、申し訳ありませんが、ご指導の程宜しくお願いいたします。

編集 削除
魔界の仮面弁士  2004-01-19 13:53:35  No: 81515  IP: [192.*.*.*]

> strCommand = "QUOTE TYPE C 932"
コマンドの指定に問題があります。
コンソール版で、「HELP」「QUOTE HELP」を実行した結果のメッセージと、
FTPCommand APIで「HELP」「QUOTE HELP」を実行した結果のメッセージを
比較してみてください。何か気づくことはありませんか?


で、コマンドの指定を変更しても期待動作しない場合は、
コンソールからのFTPコマンドの場合と、APIによる処理の
それぞれを実行し、その後、AS/400側のFTPログを参照してみてください。
WinInetの場合と、コンソール版、それぞれの処理の違いがわかるかと
思いますので、その上で、AS/400側の管理者と検討してみてください。

編集 削除
かつお  2004-01-19 16:35:59  No: 81516  IP: [192.*.*.*]

魔界の仮面弁士様

FTPCommand APIで「HELP」「QUOTE HELP」をそれぞれ実行してみました。

HELPについては、正常にコマンド送信完了。
QUOTE HELPについては、だめでした。同様に
500 SUBCOMMAND QUOT NOT VALID.というメッセージが返されます。

レベルの低いことを行って恥ずかしいのですが、このFTPCommandって、最初の4文字までしか正常に転送しないってことありませんか?適当にAAAAAAAとか打ってみたのですが、最初の4文字AAAAAしかエラーメッセージにかえされませんでした。

でも、STATUSコマンドは正常に転送できましたし、、、。

編集 削除
魔界の仮面弁士  2004-01-19 20:22:37  No: 81517  IP: [192.*.*.*]

FTPCommandで[HELP]を送信するという事は、コマンドラインで
[QUOTE HELP]を送信する、という意味になります。つまり、
コンソール版のQUOTEが、FTPCommand APIに相当するわけです。

ですから、コンソール版で[QUOTE TYPE C 932]を送出するときは、
APIからは[TYPE C 932]を送出するようにしてみてください。

> QUOTE HELPについては、だめでした。同様に
> 500 SUBCOMMAND QUOT NOT VALID.というメッセージが返されます。
コンソール版から、「QUOTE QUOTE HELP」を送出した時にも、
同じメッセージが返されませんか?

FTPサーバ側の実装にもよりますが、間違ったコマンドが送られた場合は、
主に、500番台の応答コードが返されます。例えば、
  500 (理解できないコマンド)
  501 (文法違反、パラメータが間違っている場合など)
  502 (このサーバでは、そのコマンドはサポートしていない)
などといった意味ですね。(番号の一覧は、RFC959の資料を参照して下さい)


> 最初の4文字AAAAAしかエラーメッセージにかえされませんでした。
サーバ側の文字列バッファの問題や、文字コードの違いにより、
応答の一部が欠けることもありますので、AS/400側のログと付き合わせて
確認してみてください。

編集 削除
かつお  2004-01-20 12:42:12  No: 81518  IP: [192.*.*.*]

魔界の仮面弁士様、どうも有難うございます。

> APIからは[TYPE C 932]を送出するようにしてみてください。

FTPCommandの送信は正常に行えました。お陰でかなり前進できました。

しかし、このコマンドを送信した直後に、FtpPutFileでファイルを送信しているのですが、
AS400側で受信したファイルを見ると漢字が上手く送れていないようです。通常のASCIIモードで送信したものと状況はおなじです。

難しいですね。

編集 削除