掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
FtpPutFileの戻り値 (ID:86015)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
今回の問題は、Boolean 型に +1 という値が入ってしまう点です。 VB標準のコードだけであれば、+1 になる事はありませんが、 API呼び出しの場合には、そうした問題がありえるという事で。 > それにしても > http://support.microsoft.com/default.aspx?scid=kb;en-us;305598 > http://support.microsoft.com/default.aspx?scid=kb;ja;195653 > ここのサイトも戻り値をBooleanで受け取っているし、 これらのサンプルは、あながち間違ってもいないかと。 (先の回等にあるように、適切とは言いがたいですけどね) 305598の方は、As Long で宣言されています。で、それを Boolean 型で 受ける分には、「データ型の変換」がVB側で行われるため、この時点で 「APIのTRUE(+1)」が「VBのTrue(-1)」に置き換わり、誤動作には至りません。 一方 195653 は、宣言自体は As Boolean になってしまっていますが、 比較時には、True かどうかを評価するのではなく、Falseとの比較に なっているため、こちらも正常に動作します。 FTP APIだと手続きが面倒なので、呼び出しが簡単な Beep APIで実験を。 Option Explicit Private Declare Function BeepLong Lib "kernel32" Alias "Beep" _ (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Private Declare Function BeepBoolean Lib "kernel32" Alias "Beep" _ (ByVal dwFreq As Long, ByVal dwDuration As Long) As Boolean Private Function Beep1() As Boolean 'As Longで宣言して、≠0 と判定するのがオススメ。 Beep1 = CBool(BeepLong(262, 400) <> 0) End Function Private Function Beep2() As Boolean 'これでも動作可能。 'VB側でLong(=1)がBoolean(True,-1)に置き換わる。 Beep2 = BeepLong(294, 400) End Function Private Function Beep3() As Boolean 'APIの戻り値が 0x00000000〜0x0000FFFF の範囲にあるなら、 'これも動作可能。BOOL型は、基本的には 0 か 1 しか '返されない事になっているので、16bit型でもどうにか動く。 Beep3 = CBool(BeepBoolean(330, 400) <> False) End Function Private Function Beep4() As Boolean '今回、問題になった書き方の一つ。 'APIにて、Boolean型に「+1」が格納されてしまっているが、 'この代入では、代入式の両辺でデータ型が同一なので、 'VB側で型変換が行われず、「+1」のままになってしまう。 Beep4 = BeepBoolean(349, 400) End Function Private Sub Command1_Click(Index As Integer) Dim Ret As Boolean Select Case Index Case 0: Ret = Beep1() Case 1: Ret = Beep2() Case 2: Ret = Beep3() Case 3: Ret = Beep4() End Select Label1(Index).Caption = CStr(Ret) & " ( = " & CStr(Int(Ret)) & " )" End Sub
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.