.netからなくなってしまった
VarPtrに代わる変数アドレスの抽出方法を教えてください。
よろしくお願いいたします。
具体的には、どのような処理を行おうとしているのでしょうか?
そもそも、変数の位置はメモリ内で動的に移動されますから、
たとえVarPtr関数があったとしても無意味だと思いますよ。(^_^;)
# 一応、System.Runtime.InteropServices.GCHandleを使うことで、
# インスタンスの移動を禁止/再許可する事が可能なため、
# AddrOfPinnedObjectメソッドでIntPtrを得る事はできますけれどね。
もし、過去(VB5やVB6など)のソースを移行しようとしているのであれば、
コーディングの仕方を見直した方が、効率が良いかもしれません。
大抵の場合、VarPtr(実在しませんが)関数で変数のアドレス値を
得ようとせずとも、標準的なP-Invokeの機能だけで実現できたりします。
例えば、メモリデータのコピーなどで、VB6などでは
RtlMoveMemory APIが良く使われていましたが、.NETでは、
System.Runtime.InteropServices.Marshal.StructureToPtrメソッドなどが
使えるため、そうしたAPIに頼る必要も無くなっています。
具体的な内容です。
・他のコンピュータにメッセージを送信する処理
・VB6でAPIのNetMessageBufferSend ()関数を使用していたソースをVB.NETに移行
VB.NETは初めてのためVB6の使用していたAPIをVB.NETに移行すると
「○○の宣言はサポートされません。」など複数出てきてかなり苦労しております。
やはり一度本などでVB.NETについて一から勉強してみます。
ありがとうございました。
書き方はいろいろあると思いますけど、例えば、こんな感じかな。
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もコンストラクタに含めた方が、使いやすいかな?
ありがとうございました。助かりました。
VB.NETを少し叩いてみてVB6とはかなり別物ですね。。。
勉強しなおします。
ツイート | ![]() |