タイトル : 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 ですね。 |