- PR -

VB6.0 FTPの後処理について

1
投稿者投稿内容
もも
常連さん
会議室デビュー日: 2005/07/25
投稿数: 46
投稿日時: 2006-03-02 14:05
FTPの後処理について気になることがあります。
あちらこちらのHPで調べた
1、InternetOpen
2、InternetConnect
3、FtpGetFile
4、2のInternetCloseHandle
5、1のInternetCloseHandle

と処理しております。
そのあと、アプリケーションを終了すると、すぐに終了せず、
何か処理をしているみたいです。(約1分ぐらい・・・)

FTPの手順が間違っているのでしょうか。
また、終了しない原因は何かあるのでしょうか。
ご存知の方、また、気づいた点がおありの方、
ご教授お願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-02 14:18
引用:

ももさんの書き込み (2006-03-02 14:05) より:

FTPの手順が間違っているのでしょうか。


いえ、間違っていないと思います。

引用:

そのあと、アプリケーションを終了すると、すぐに終了せず、
何か処理をしているみたいです。(約1分ぐらい・・・)


InternetCloseHandle 関数の戻り値は TRUE になってますよね?
大きなファイルを FtpGetFile しない限りは、待たされないと思います。
(FtpGetFile 関数って非同期でしたっけ?)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
もも
常連さん
会議室デビュー日: 2005/07/25
投稿数: 46
投稿日時: 2006-03-02 14:29
じゃんぬねっとさん返信ありがとうございます。

引用:

InternetCloseHandle 関数の戻り値は TRUE になってますよね?
大きなファイルを FtpGetFile しない限りは、待たされないと思います。
(FtpGetFile 関数って非同期でしたっけ?)



戻り値は「true」になってます。

しかも、試してみたところ、

1、InternetOpen
2、InternetConnect
3、2のInternetCloseHandle
4、1のInternetCloseHandle

FtpGetFileをしない場合の上記の処理でも終了に時間がかかります。
3,4のInternetCloseHandleで時間がかかるわけではなく
画面で、Unload Meとした後に、アプリケーションがすぐに終わらない状態なのです。

環境が悪いのか、仕様なのか・・・(調べても同じ状況の方はみつかりませんでしたが・・・)
Exeで実行すると、分かりにくいのですが、VisualStudio VBでデバックすると
VisualStudioが固まってしまう感じなのです・・・・
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-02 14:56
引用:

ももさんの書き込み (2006-03-02 14:29) より:

FtpGetFileをしない場合の上記の処理でも終了に時間がかかります。
3,4のInternetCloseHandleで時間がかかるわけではなく
画面で、Unload Meとした後に、アプリケーションがすぐに終わらない状態なのです。


基本的なことを聞くようで申し訳ないのですが、
1 〜 4 全部を撤去するとすぐ終了するということですか?
であれば、FTP 周りの処理が原因であることが確定しますが。(念のための確認です)

私の方でも試してみようと思いますので、問題のない範囲のソースをください。
(接続する URL は伏せてください)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
もも
常連さん
会議室デビュー日: 2005/07/25
投稿数: 46
投稿日時: 2006-03-02 15:20
じゃんぬねっとさま親切にありがとうございます。
ソースです

Public Const INTERNET_DEFAULT_FTP_PORT = 21
Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Public Const INTERNET_SERVICE_FTP = 1
Public Const INTERNET_NO_CALLBACK = 0

private function FTPtest()
Dim hInternet As Long
Dim hFTP As Long
Dim mb As Boolean
Do
hInternet = InternetOpen(vbNullString,INTERNET_OPEN_TYPE_PRECONFIG,vbNullString, vbNullString, 0&)
If hInternet = 0& Then
Exit Do
End If

hFTP = InternetConnect(hInternet, "[サーバ名]", INTERNET_DEFAULT_FTP_PORT, "[ユーザ名]", "[パスワード]", INTERNET_SERVICE_FTP,0, INTERNET_NO_CALLBACK)
If hFTP = 0& Then
Exit Do
End If
Loop While False

If hFTP <> 0 Then
mb = InternetCloseHandle(hFTP)
End If

If hInternet <> 0 Then
mb = InternetCloseHandle(hInternet)
End If
end function

FTP接続の確立を行わないと、終了はすばやく終わります。
また、上記処理を行わない場合も終了はすばやく終わります。

試していただけるなんて、すみません。。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-02 16:04
引用:

ももさんの書き込み (2006-03-02 15:20) より:

FTP接続の確立を行わないと、終了はすばやく終わります。
また、上記処理を行わない場合も終了はすばやく終わります。
試していただけるなんて、すみません。。。


試してみましたが、問題なくすぐ終了しますね。

関係ないところですが、

引用:

If hInternet = 0& Then
  Exit Do
End If

If hFTP = 0& Then
  Exit Do
End If


こんな面倒な実装をしなくても、Exit Function で処理を抜けるべきだと思います。
hFTP まで制御が移った場合は、hInternet のハンドルのみ Close して終了します。

ここに、Do 〜 Loop を使っていると While False とはいえ何か怖いです。(^-^;)
実害はないんですが、読み手はループ処理だと錯覚しますよ。

引用:

mb = InternetCloseHandle(hFTP)


戻り値は Boolean ではなく Long ですよ。

で、問題となる原因が不明ですね...

現在は FTPtest メソッドのみを実行してテストしているんですよね?
他に派生してどこかのメソッドを呼び出したりはしていませんよね?

基本的な確認ばかりで申し訳ありません。
ただ、以上に上げたようなミニマムテストをしているのならば、
原因はサーバ側にあるんじゃないかなんて考えてしまいます...

別のホストで試して頂けませんか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
もも
常連さん
会議室デビュー日: 2005/07/25
投稿数: 46
投稿日時: 2006-03-02 16:31
じゃんぬねっとさま 試していただきありがとうございます。

サーバ側の問題ではとの指摘を受け、ユーザ名「anonymous」(デフォルト?)で
いままで、ログインしていたのを新しくユーザを作成し、実行してみましたところ
無事に難なく動きました。
使用しているユーザがまずかったようです。

お手数をお掛けし、申し訳ありません。

また、コーディングの指摘についてもありがとうございます。
今後は気をつけていきたいと思います。

ていねいにありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)