tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: VB2010 internetsetoption
投稿日: 2015/04/15(Wed) 15:21
投稿者魔界の仮面弁士
>     Public Const INTERNET_OPTION_CONNECT_TIMEOUT As Long = 2 '接続タイムアウト

これらの定数値は DWORD 型です。VB2010 でいえば UInt32 相当。

As Integer や As UInteger ならばサイズが合いますが、
As Long (すなわち Int64) では合致しません。


>     Private Declare Auto Function InternetSetOption Lib "wininet.dll" _
>         (ByVal hInternet As IntPtr, ByVal dwOption As Integer, _
>          ByVal lpBuffer As IntPtr, ByVal lpdwBufferLength As Integer) As Boolean

lpBuffer を ByVal IntPtr にしているようですが、あえてそうしたのでしょうか?
複数の型を扱うパラメータなので、VB6 の Any を直訳表現すると、確かにそうなってしまいますが…。

たとえば、タイムアウトの設定であれば、整数値がそのまま渡せれば良いので、
別に IntPtr にする必要も無いと思います。また、タイムアウト以外の各種オプションを
扱うにしても、各オプション指定に合わせた型でオーバーロードした方が楽だと思いますよ。

たとえば ByVal IntPtr のまま INTERNET_OPTION_PROXY オプションを扱おうとすると、
 Dim sz = Marshal.SizeOf(struct_INTERNET_PROXY_INFO)
 Marshal.AllocCoTaskMem(sz)
 Marshal.StructureToPtr(struct_INTERNET_PROXY_INFO, ptr, True)
 ret = InternetSetOption(h, INTERNET_OPTION_PROXY, ptr, sz)
のような面倒な形になりますが、API 宣言をオーバーロードして
ByRef lpBuffer As INTERNET_PROXY_INFO な Declare も同時に用意しておけば、
 ret = InternetSetOption(h, INTERNET_OPTION_PROXY, struct_INTERNET_PROXY_INFO, Marshal.SizeOf(GetType(INTERNET_PROXY_INFO)))
のように、直接渡せるようになりますよね。



>     Function FtpSetOption(pOption As Long, pValue As Long) As Boolean
引数を Int64 型にしているのは意図的ですか?


>         'ポ-トオープン
「-」→「ー」


>         hOpen = InternetOpen(USER_AGENT, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
InternetOpen の宣言は提示されなかったので、ここは正しいと仮定して…。


>         If hOpen = 0 Then
ではなく「If hOpen = IntPtr.Zero Then」ですよね。

API の利用時には『暗黙の型変換』に頼らぬよう、
「Option Strict On」を設定しておくことを強くお奨めします。
(今回の指摘事項の多くが、それで防げたはず)


>   FtpSetOption= False
Return は使わないのですか?


> LenB(pValue)
VB2010 に、このような関数は用意されていないはずです。(VB6 にはありますが)
恐らくは自作関数だと思いますが、それはどういった実装になっていますか?



> 粗い抜粋ですがこのような感じです。
結局、InternetSetOption は True / False いずれを返してくるのでしょうか?


> 接続タイムアウト時間を計測しても5secではタイムアウトしませんでした。
InternetSetOption が失敗したことで、そのような結果になったのでしょうか?
それとも、呼び出しは成功したのに、タイムアウトが反映されていないのでしょうか?


> なにかアドバイスあればお願い致します。
今回提示頂いたコードでは、InternetSetOption の引数が、
 Declare 宣言:IntPtr, Integer, IntPtr, Integer
であるのに対し、そこに、
 渡した値:IntPtr, Long, Long, LenB(Long)
を渡していますよね。(LenB の戻り値が何であるかは明確になっていませんが)


引数の型が合致していないという時点で、既に大問題なのですが、
Option Strict が Off のため、コンパイルは通ってしまっているようです。

何にせよ、見直すべきは lpBuffer と lpdwBufferLength ですね。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。