- PR -

WinCE5.0開発 .netCF(VB.NET)を使用したFTP処理

1
投稿者投稿内容
fiso
会議室デビュー日: 2007/08/04
投稿数: 10
投稿日時: 2007-08-04 18:34
はじめまして。開発初心者のfisoといいます。
次の環境でFTPサーバへアクセスしてファイルをGETしたりPUTしたりするプログラムをwininet.dllを使い開発しております。

このプログラムを実行すると、FTPサーバへ接続できず「InternetConnect」の実行結果が「0」で返ってきてしまいます。
エラーコードを見ると「12007」が出力されており、FTPサーバ名が解決できていないようです。
また、ソースの定義部分の一部を下記のように修正して実行したところ、エラーコードが「12029」に変わったものの、FTPサーバへ接続できませんでした。

"InternetOpenA" → "InternetOpenW"
"InternetConnectA" → "InternetConnectW"

どなたか解決方法をご存知の方がいらっしゃいましたら解決方法を教えてください。




【開発環境】
・WinXP pro
・VS2005(VS2005 VB.net スマートデバイス開発)

【実行環境】
・WindowsCE5.0
・Compact Framework 2.0



以下はソースです。

'============== 実行部分 ===================
' FTPサーバからファイルを取得
Private Sub ftpGet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mente.Click
Dim hOpen As Integer 'インターネットサービスのハンドル
Dim hConnection As Integer 'インターネットセッションのハンドル
Dim result As Integer
hOpen = 0
hConnection = 0
Dim SERVER As String = "localhost"
Dim USER As String = "testUser"
Dim PASSWORD As String = "testPW"

'インターネットサービスのハンドル取得 - hOpen
hOpen = InternetOpen("Test", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
If (hOpen <> 0) Then 'ハンドル取得成功
'インターネットセッションのハンドル取得(FTPサーバへ接続) - hConnection
hConnection = InternetConnect(hOpen, SERVER, INTERNET_DEFAULT_FTP_PORT, USER, PASSWORD, INTERNET_SERVICE_FTP, 0, 0)
If (hConnection <> 0) Then '接続成功

'FTPサーバのカレントディレクトリを変更
result = FtpSetCurrentDirectory(hConnection, "/test")
If (result <> 0) Then 'ディレクトリ変更成功

'ファイルをダウンロード
result = FtpGetFile(hConnection, "sample.txt", "D:\sample.txt", False, _
FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_ASCII Or INTERNET_FLAG_RELOAD, 0)

If (result = 0) Then 'ダウンロード失敗
MsgBox("ファイルの取得に失敗しました。" & Err.LastDllError)
End If
Else
MsgBox("ディレクトリの移動に失敗しました。" & Err.LastDllError)
End If
Else
MsgBox("FTPサーバへ接続できませんでした。" & Err.LastDllError)
End If
Else
MsgBox("FTPサーバへ接続できませんでした。" & Err.LastDllError)
End If

'インターネットセッションを閉じる
If (hConnection <> 0) Then InternetCloseHandle(hConnection)

'インターネットサービスを閉じる
If (hOpen <> 0) Then InternetCloseHandle(hOpen)
End Sub


'======================= 定義部分 =====================
Public Const INTERNET_DEFAULT_FTP_PORT As Integer = 21
Public Const INTERNET_SERVICE_FTP As Integer = 1
Public Const INTERNET_FLAG_PASSIVE As Integer = &H8000000
Public Const INTERNET_OPEN_TYPE_PRECONFIG As Integer = 0
Public Const INTERNET_OPEN_TYPE_DIRECT As Integer = 1
Public Const INTERNET_OPEN_TYPE_PROXY As Integer = 3
Public Const INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY As Integer = 4
Public Const MAX_PATH As Integer = 260
Public Const PassiveConnection As Boolean = True

' インターネットハンドルを取得します。
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Integer, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Integer) As Integer

' サーバへ接続します。
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Integer, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal lService As Integer, ByVal lFlags As Integer, ByVal lContext As Integer) As Integer

' インターネットハンドルを閉じます。
Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Integer) As Integer

' サーバのカレントディレクトリを設定します。
Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Integer, ByVal lpszDirectory As String) As Boolean

' サーバからファイルを取得します。
Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" (ByVal hConnect As Integer, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal dwFlags As Integer, ByRef dwContext As Integer) As Boolean
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-08-04 23:05
こんばんは。

ソースコードをざっと見て、気づいた点だけ…

引用:

fisoさんの書き込み (2007-08-04 18:34) より:
"InternetOpenA" → "InternetOpenW"
"InternetConnectA" → "InternetConnectW"



Windows CEのWindows APIはUnicodeしかサポートしていないはずですので
後ろにWが付くほうで正解だと思います。

引用:


Dim SERVER As String = "localhost"



これってWindows CEデバイス(エミュレータ?)上で、FTPサーバーが動いているってことでいいんですよね?
Windows CE上で動作するFTPサーバーなんてあるのかなと思って、検索してみたらあるんですね。
ftpサーバ for Windows CE
fiso
会議室デビュー日: 2007/08/04
投稿数: 10
投稿日時: 2007-08-04 23:46
Tdnr_Symさん回答ありがとうございます。
やはり「W」で書くのが正解なんですね。ネット上に落ちてるサンプルソースを見ると
WindowsCEのものではなく、通常のWindowsのものだったりするのでもしかしたらそこは
違うのかな、とは思いました。

「W」にプログラムを修正してもエラーコード「12029」が出て接続できません。他にも
原因があるのでしょうか?
なお、コマンドプロンプトからftpに接続すると繋がるのでFTPサーバ自体に問題は
なく、ユーザIDやパスワードにも誤りはありません。

> これってWindows CEデバイス(エミュレータ?)上で、FTPサーバーが動いてい
> るってことでいいんですよね?

説明が足りず申し訳ありません。
FTPサーバは開発しているWindowsXP上で動いており、エミュレータ上では動いて
おりません。
ただし、エミュレーターもFTPサーバも1つのPCの中で動いているので接続時に
「localhost」と指定しております。
そもそもこいうい環境が問題なんですかね?
FTPサーバは別のマシンの方が良いとか。。。。。。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2007-08-05 00:03
諸農です。

引用:

fisoさんの書き込み (2007-08-04 23:46) より:
なお、コマンドプロンプトからftpに接続すると繋がるのでFTPサーバ自体に問題は
なく、ユーザIDやパスワードにも誤りはありません。



ん?
エミュレータ上のコマンドプロンプトでlocalhost指定で動作確認できている、でしょうか?

引用:

FTPサーバは開発しているWindowsXP上で動いており、エミュレータ上では動いて
おりません。
ただし、エミュレーターもFTPサーバも1つのPCの中で動いているので接続時に
「localhost」と指定しております。



なんか勘違いされているような気がしますけど。
作っているプログラムはどこに接続したいのですか?
CE上のFTPサーバーじゃないんですよね?


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-08-05 00:18
こんばんは。

引用:

fisoさんの書き込み (2007-08-04 23:46) より:
説明が足りず申し訳ありません。
FTPサーバは開発しているWindowsXP上で動いており、エミュレータ上では動いて
おりません。
ただし、エミュレーターもFTPサーバも1つのPCの中で動いているので接続時に
「localhost」と指定しております。



やっぱり思ったとおりでしたか。
開発PCとエミュレータとそれぞれで、IPアドレスやホスト名は同じか確認してみてください。
おそらく違うと思いますよ。

#追記(始め)
あっエミュレータでネットワークの設定を特にしていない場合はの話です。
ホスト名は確かデフォルトでCEエミュレータ側はホスト名が"Windows CE"だったと思います。
DHCPの場合、ホストOS(XP)とCEエミュレータでは、別々のIPが振られると思います。
#追記(終わり)


引用:

そもそもこいうい環境が問題なんですかね?
FTPサーバは別のマシンの方が良いとか。。。。。。



おそらく別マシンじゃなくてもいいんじゃないでしょうか。
サーバー指定をホストOS側(XP)のものにしてやるとよいと思います。

バージョンやプロトコルは違いますが、私は半年ほど前に仕事で
同一マシン上のホストOS(XP)とCEエミュレータとで
ソケット通信できるのを確認してます。


[ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2007-08-05 00:43 ]
fiso
会議室デビュー日: 2007/08/04
投稿数: 10
投稿日時: 2007-08-07 01:38
Tdnr_Symさん、Jubeiさんご回答ありがとうございます。
開発PCとエミュレータでは別のIPアドレスが割り当てられるんですね。

なお、エミュレーターはVS2005にデフォルトでインストールされているPocetPC2003を
使っているのでWinCEのエミュレーター(設定の仕方がわからなかったため)ではないの
ですが、開発環境として問題ありますかね?

お陰さまで、作成したEXEをWinCE端末で動作させたら無事にFTP通信できました。
ありがとうございました。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2007-08-07 06:57
諸農です。

引用:

fisoさんの書き込み (2007-08-07 01:38) より:
なお、エミュレーターはVS2005にデフォルトでインストールされているPocetPC2003を
使っているのでWinCEのエミュレーター(設定の仕方がわからなかったため)ではないの
ですが、開発環境として問題ありますかね?



Windows Mobile のサイトにアップデート等々がありますので、必要な物があるか無いかの確認をされるのが良いと思います。
#PPC2003とWinCEの画面の縦横構成比って違うかったと思うのですが。。。
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
1

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