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

タイトル 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 なのか…。

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

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