- - PR -
WinCE5.0開発 .netCF(VB.NET)を使用したFTP処理
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 | ||||||||
|
投稿日時: 2007-08-04 23:05
こんばんは。
ソースコードをざっと見て、気づいた点だけ…
Windows CEのWindows APIはUnicodeしかサポートしていないはずですので 後ろにWが付くほうで正解だと思います。
これってWindows CEデバイス(エミュレータ?)上で、FTPサーバーが動いているってことでいいんですよね? Windows CE上で動作するFTPサーバーなんてあるのかなと思って、検索してみたらあるんですね。 ftpサーバ for Windows CE | ||||||||
|
投稿日時: 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サーバは別のマシンの方が良いとか。。。。。。 | ||||||||
|
投稿日時: 2007-08-05 00:03
諸農です。
ん? エミュレータ上のコマンドプロンプトでlocalhost指定で動作確認できている、でしょうか?
なんか勘違いされているような気がしますけど。 作っているプログラムはどこに接続したいのですか? CE上のFTPサーバーじゃないんですよね? _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2007-08-05 00:18
こんばんは。
やっぱり思ったとおりでしたか。 開発PCとエミュレータとそれぞれで、IPアドレスやホスト名は同じか確認してみてください。 おそらく違うと思いますよ。 #追記(始め) あっエミュレータでネットワークの設定を特にしていない場合はの話です。 ホスト名は確かデフォルトでCEエミュレータ側はホスト名が"Windows CE"だったと思います。 DHCPの場合、ホストOS(XP)とCEエミュレータでは、別々のIPが振られると思います。 #追記(終わり)
おそらく別マシンじゃなくてもいいんじゃないでしょうか。 サーバー指定をホストOS側(XP)のものにしてやるとよいと思います。 バージョンやプロトコルは違いますが、私は半年ほど前に仕事で 同一マシン上のホストOS(XP)とCEエミュレータとで ソケット通信できるのを確認してます。 [ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2007-08-05 00:43 ] | ||||||||
|
投稿日時: 2007-08-07 01:38
Tdnr_Symさん、Jubeiさんご回答ありがとうございます。
開発PCとエミュレータでは別のIPアドレスが割り当てられるんですね。 なお、エミュレーターはVS2005にデフォルトでインストールされているPocetPC2003を 使っているのでWinCEのエミュレーター(設定の仕方がわからなかったため)ではないの ですが、開発環境として問題ありますかね? お陰さまで、作成したEXEをWinCE端末で動作させたら無事にFTP通信できました。 ありがとうございました。 | ||||||||
|
投稿日時: 2007-08-07 06:57
諸農です。
Windows Mobile のサイトにアップデート等々がありますので、必要な物があるか無いかの確認をされるのが良いと思います。 #PPC2003とWinCEの画面の縦横構成比って違うかったと思うのですが。。。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ |
1