タイトル : Re^5: VB2010 internetsetoption 投稿日 : 2015/04/15(Wed) 19:34 投稿者 : 魔界の仮面弁士
> > > LenB(pValue) > > VB2010 に、このような関数は用意されていないはずです。(VB6 にはありますが) > > 恐らくは自作関数だと思いますが、それはどういった実装になっていますか? 現状の LenB 実装がどうなっていたのか分かりませんが、 VB2010 でそれに近いのは Marshal.SizeOf ですね。 とはいえタイムアウト設定なら、API に渡す設定値は「32bit 整数」なので、 今回の lpdwBufferLength は「4」固定なのですけれども。 > > それとも、呼び出しは成功したのに、タイムアウトが反映されていないのでしょうか? > 呼び出しは成功したようにみえたのですが、再確認いたします。 lpBuffer が要求しているのは設定データの「ポインタ」です。設定データの「値」ではありません。 元のコードでは『ByVal lpBuffer As IntPtr』で宣言していましたよね。 だとしたら、ここに、5000 という値を直接渡すのは NG です(ポインタを示さねばならない)。 もしも元の Declare 宣言のまま呼び出すとすれば、値をポインターとして渡すために、 (1) 4 バイト分のメモリ領域を確保する(Marshal.AllocHGlobal など) (2) その領域内に 5000 という数値を書き込んでおく(Marshal.WriteInt32 など) (3) 確保したメモリ領域のポインタを、ByVal IntPtr な引数に渡す(1 の IntPtr 値を渡す) (4) API 呼出し後は、確保していたメモリを解放する(Marshal.FreeHGlobal) という追加の手続きが必要になってきます。 とはいえ、それはあまりにも面倒ですから、先の投稿では > > lpBuffer を ByVal IntPtr にしているようですが、あえてそうしたのでしょうか? とお聞きした次第です。 > > 何にせよ、見直すべきは lpBuffer と lpdwBufferLength ですね。 lpBuffer の宣言あるいは呼び出し方(あるいはその両方)を見直す必要があるわけですが、 上述の通り、「値」と「参照」の違いを意識して書き換えるようしてみてください。 構造体なのかクラスなのか、ByVal なのか ByRef なのか…。 |