.Net でVarPtrの代わりなるものは?

解決


.NET初心者  2003-07-10 01:25:41  No: 78599

.netからなくなってしまった
VarPtrに代わる変数アドレスの抽出方法を教えてください。
よろしくお願いいたします。


魔界の仮面弁士  2003-07-10 08:18:22  No: 78600

具体的には、どのような処理を行おうとしているのでしょうか?

そもそも、変数の位置はメモリ内で動的に移動されますから、
たとえVarPtr関数があったとしても無意味だと思いますよ。(^_^;)

# 一応、System.Runtime.InteropServices.GCHandleを使うことで、
# インスタンスの移動を禁止/再許可する事が可能なため、
# AddrOfPinnedObjectメソッドでIntPtrを得る事はできますけれどね。

もし、過去(VB5やVB6など)のソースを移行しようとしているのであれば、
コーディングの仕方を見直した方が、効率が良いかもしれません。

大抵の場合、VarPtr(実在しませんが)関数で変数のアドレス値を
得ようとせずとも、標準的なP-Invokeの機能だけで実現できたりします。

例えば、メモリデータのコピーなどで、VB6などでは
RtlMoveMemory APIが良く使われていましたが、.NETでは、
System.Runtime.InteropServices.Marshal.StructureToPtrメソッドなどが
使えるため、そうしたAPIに頼る必要も無くなっています。


.NET初心者  2003-07-10 20:39:43  No: 78601

具体的な内容です。
・他のコンピュータにメッセージを送信する処理
・VB6でAPIのNetMessageBufferSend ()関数を使用していたソースをVB.NETに移行 

VB.NETは初めてのためVB6の使用していたAPIをVB.NETに移行すると
「○○の宣言はサポートされません。」など複数出てきてかなり苦労しております。
やはり一度本などでVB.NETについて一から勉強してみます。
ありがとうございました。


魔界の仮面弁士  2003-07-11 01:17:45  No: 78602

書き方はいろいろあると思いますけど、例えば、こんな感じかな。

Imports System.Runtime.InteropServices
Public Class Messenger
    Private Sender As String
    Public ServerName, FromName As String
    <DllImport("netapi32.dll", CharSet:=CharSet.Unicode)> _
    Public Shared Function NetMessageBufferSend(ByVal servername As String, _
         ByVal msgname As String, _
         ByVal fromname As String, _
         ByVal buf As String, _
         ByVal buflen As System.Int32) As System.Int32
    End Function
    Public Sub New()
        Me.Sender = Nothing
    End Sub
    Public Sub New(ByVal Sender As String)
        Me.Sender = Sender
    End Sub
    Public Sub SendMessage(ByVal Message As String)
        Dim Ret As System.Int32
        Dim Size As System.Int32
        Size = Message.Length * 2 'Unicodeなので、バイト数は常に文字数の2倍
        Ret = Me.NetMessageBufferSend(Me.Sender, Me.ServerName, Me.FromName, Message, Size)
    End Sub
End Class

使うときは、
  Dim X As New Messenger
  X.ServerName = TextBox1.Text
  X.FromName = TextBox2.Text
  X.SendMessage(Me.TextBox3.Text)
って感じで。

ServerNameやFromNameもコンストラクタに含めた方が、使いやすいかな?


.NET初心者  2003-07-12 03:10:06  No: 78603

ありがとうございました。助かりました。

VB.NETを少し叩いてみてVB6とはかなり別物ですね。。。
勉強しなおします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加