API:wininet.dllを利用したFtpPutFileで失敗する

解決


ねむねむ  2012-08-11 11:04:18  No: 147740  IP: 192.*.*.*

Visual Studio 2008 で .NET compact Framework 3.5 を利用してモバイル開発しています。

PC上にFTPサーバを立て、端末側からファイル送信したいと思っており、wininet.dllのAPIを利用していますが、
FTPサーバへのコネクトは成功しているようですが、FtpPutFileで失敗しています。
Err.LastDllError の値は87という事で、APIの定義か引数かがおかしいのだとは思いますが、どこがおかしいかの判断がつかない状況です。
ソースコードの一部を上げますので、定義や引数に間違いがないか、見てやっていただければと思います。

あと、FtpPutFileWなどのWindows APIの定義方法を調べるのって普通どこで調べるのが確実性がありますか?
インターネットでも皆様ソースコード公開されてるので勉強にはなりますが、MSDN的なものがあるんでしょうか?


    'API定義
    Declare Function FtpPutFile Lib "wininet" Alias "FtpPutFileW" ( _
        ByVal hConnect As System.IntPtr, _
        ByVal lpszlocalfile As String, _
        ByVal lpszNewRemoteFile As String, _
        ByVal dwFlags As Int32, _
        ByVal dwContext As Int32) As Int32

    Private Shared hFtpSession As IntPtr
    Private Const FTP_TRANSFER_TYPE_BINARY As Int32 = 2

    'FtpPutFile関数
    FtpPutFile(hFtpSession, "\My Documents\XXX\AAA.csv", _
               "AAA.csv", FTP_TRANSFER_TYPE_BINARY, 0)

編集 削除
Koz  2012-08-17 00:41:01  No: 147741  IP: 192.*.*.*

この書き方だと Unicode バージョンの API は呼べません。

FtpPutFileW でなく、FtpPutFileA にすればいい気がしますが、CE ってAnsi版を持ってないんでしたっけ?

Declare Unicode Function FtpPutFile Lib "wininet" Alias "FtpPutFileW" 〜

とか

<DllImport("wininet", CharSet:=CharSet.Unicode)> _
Shared Function FtpPutFile( _
    ByVal hConnect As System.IntPtr, _
    ByVal lpszlocalfile As String, _
    ByVal lpszNewRemoteFile As String, _
    ByVal dwFlags As Int32, _
    ByVal dwContext As Int32) As Int32

でどうでしょう。

定義方法については、MSDN で引数の意味や使い方を調べ、C のヘッダファイルを見るのが確実かと思います。

編集 削除
ねむねむ  2012-08-17 09:48:46  No: 147742  IP: 192.*.*.*

Declare Unicode Function FtpPutFile Lib "wininet" Alias "FtpPutFileW" 〜
の書き方はサポートされてなくて使えなかったので、

    <DllImport("wininet", CharSet:=CharSet.Unicode)> _
    Shared Function FtpPutFile( _
        ByVal hConnect As System.IntPtr, _
        ByVal lpszlocalfile As String, _
        ByVal lpszNewRemoteFile As String, _
        ByVal dwFlags As Int32, _
        ByVal dwContext As Int32) As Int32
    End Function

に書き換えて、とりあえずエラーは無くなりました。
…しかし InternetCloseHandle や InternetConnect のAPIはこの書き方じゃなくてもイケてましたが何故…。
念のためこれらのAPIも置き換えておきました。

CEはUnicode版のAPIセットしか持ってないようです。


エラーは無くなったものの、実際ファイル転送されてないという問題が今度は発生。
これはプログラムの問題じゃない気がするので、今回はとりあえず解決とさせていただきます。

編集 削除