VB.NET初心者です。
次の環境でFTPへ接続するプログラムを組んでいます。
掲示板などを調べて、どうにか「FtpGetFile」や「FtpPutFile」はできる
ようになったのですが、「FtpFindFirstFile」ができません。
解決方法をご存知の方がいらっしゃったら教えて下さい。
【開発環境】
・WinXP pro
・VS2005(VS2005 VB.net スマートデバイス開発)
【実行環境】
・WindowsCE5.0
・Compact Framework 2.0
【ソース】
'==== 構造体・定義等 =====
Option Strict Off
Option Explicit On
Imports System.Runtime.InteropServices
Module MenteModule
Public Const FTP_CONNECT_MSG As String = "test"
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 Const FTP_TRANSFER_TYPE_UNKNOWN As Integer = &H0&
Public Const FTP_TRANSFER_TYPE_ASCII As Integer = &H1&
Public Const FTP_TRANSFER_TYPE_BINARY As Integer = &H2&
Public Const FILE_ATTRIBUTE_NORMAL As Integer = &H80
Public Const INTERNET_FLAG_RELOAD As Integer = &H80000000
Public Const FTPSENDKBN_BINARY As String = "0"
Public Const FTPSENDKBN_ASCII As String = "1"
Public Const MAX_PATH As Short = 260
Public Const INTERNET_OPEN_TYPE_DIRECT As Short = 1
Public Const INTERNET_INVALID_PORT_NUMBER As Short = 0
Public Const INTERNET_SERVICE_FTP As Short = 1
Structure FILETIME
Dim dwLowDateTime As Integer
Dim dwHighDateTime As Integer
End Structure
Structure WIN32_FIND_DATA
Dim dwFileAttributes As Integer
Dim ftCreationTime As FILETIME
Dim ftLastAccessTime As FILETIME
Dim ftLastWriteTime As FILETIME
Dim nFileSizeHigh As Integer
Dim nFileSizeLow As Integer
Dim dwReserved0 As Integer
Dim dwReserved1 As Integer
<VBFixedString(MAX_PATH), System.Runtime.InteropServices.MarshalAs _
(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=MAX_PATH)> _
Public cFileName As String
<VBFixedString(14), System.Runtime.InteropServices.MarshalAs _
(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=14)> _
Public cAlternate As String
End Structure
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenW" (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 "InternetConnectW" (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 InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileW" (ByVal hFind As Integer, ByRef lpvFindData As WIN32_FIND_DATA) As Integer
Public Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileW" (ByVal hFtpSession As Integer, ByVal lpszSearchFile As String, ByRef lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Integer, ByVal dwContent As Integer) As Integer
End Module
'====== 実行部分 =========
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Image
Imports System.IO
Public Class Test
Private Sub Buttom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReadText.Click
Dim hOpen As Integer = 0
Dim hConnection As Integer = 0
Dim result As Integer = 0
Dim Pdata As New WIN32_FIND_DATA
hOpen = InternetOpen(FTP_CONNECT_MSG, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
' インターネットサービスのハンドルに成功したかチェックする
If (hOpen <> 0) Then
'インターネットセッションのハンドル取得(FTPサーバへ接続) - hConnection
hConnection = InternetConnect(hOpen, "XXX.XXX.XXX.XXX", INTERNET_DEFAULT_FTP_PORT, "user", "pw", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)
' 接続に成功したかチェックする
If (hConnection <> 0) Then
result = FtpFindFirstFile(hConnection, "*.*", Pdata, 0, 0)
Me.msg2.Text = "結果: " & Pdata.cFileName & " コード = " & result
Else
Me.msg2.Text = "FTP接続に失敗"
End If
Else
Me.msg2.Text = "インターネットサービスのハンドルに失敗"
End If
'FTPサーバへの接続を閉じる
If (hConnection <> 0) Then InternetCloseHandle(hConnection)
'インターネットサービスを閉じる
If (hOpen <> 0) Then InternetCloseHandle(hOpen)
End Sub
End Class
『Windows用の「WIN32_FIND_DATA」』と
『Windows CE用の「WIN32_FIND_DATA」』は、
構造が違うみたいですけど・・・
(http://msdn2.microsoft.com/en-us/library/aa365740.aspx)
(http://msdn2.microsoft.com/en-us/library/ms915521.aspx)
大吉末吉さん回答ありがとうございます。
WindowsCEとWindowsでは構造が違うのですね…。
教えて頂いたサイトを見たのですが、「Windows Embedded」で実装されている感じでした。
初心者なので、これを見てもいまいちのですが、VB.NET(.NET Compact Framework)のサイトがあったりしないでしょうか?
ネットで検索したのですが、検索キーが悪いのか見つからなくて…。
> 「Windows Embedded」で実装されている感じでした。
> VB.NET(.NET Compact Framework)のサイトがあったりしないでしょうか?
申し訳ありませんが・・・私は見たことが無いです。
そもそも、「FtpFindFirstFile」等の関数は、VB.NET(.NET Framework)ではなく、
「Platform SDK」で実装されている関数ですから・・・
スマートデバイスで対応するのも、「.NET Compact Framework」はなく、「Windows Embedded」ってことになります。
> 初心者なので
頑張って勉強してください。ファイト!
ちなみに、冷静に宣言文の対応関係を確認すれば、どうすれば良いか推測できると思いますよ。
大吉末吉さん、いつも回答ありがとうございます。
>「Platform SDK」で実装されている関数ですから・・・
> スマートデバイスで対応するのも、「.NET Compact Framework」はなく、
>「Windows Embedded」ってことになります。
「Windows Embedded」がよくわかってないので、的外れな質問になってしまうかもしれませんが、「Windows Embedded」で「FtpFindFirstFile」の関数を作りDLLにして「.NET Compact Framework」側でこのDLLを呼んで処理するなんて事はできるのでしょうか?
> 冷静に宣言文の対応関係を確認すれば、どうすれば良いか推測できると
> 思いますよ。
頑張って解析してみようと思います。
ツイート | ![]() |