Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0027: Speicherzugriffe mit Visual Basic .NET

 von 

Beschreibung

Unter Visual Basic 6 gab es die undokumentierten ...Ptr-Funktionen, die es unter VB.NET leider nicht mehr gibt. Folglich wird es etwas schwerer an die Addresse einer Variable zu gelangen, aber trotzdem ist es möglich.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [1,88 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2002/2003
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.XML
'  - System.Windows.Forms
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Data
'  - System.Diagnostics
'

' ##############################################################################
' ################################ modMain.vb ##################################
' ##############################################################################
Option Explicit On 
Option Strict On

Imports System.Runtime.InteropServices

Public Module modMain
    <DllImport("KERNEL32.DLL")> _
    Public Sub CopyMemory( _
        ByVal Destination As System.Int32, _
        ByVal Source As System.Int32, _
        ByVal Length As System.Int32 _
    )
        ' <native implementation>
    End Sub

    Private Declare Sub CopyMemoryByRef Lib _
      "kernel32.dll" Alias "RtlMoveMemory" ( _
        ByRef Destination As System.Int32, _
        ByRef Source As System.Int32, _
        ByVal Length As System.Int32 _
    )

    Public Sub Main()
        Console.WriteLine("*** Beispiel 1")

        Dim strSource As String = "Hallo Welt!"
        CConsoleHelper.WriteLineStringVariable( _
          "strSource", strSource)
        Dim strDest As String = "ActiveVB.de"
        CConsoleHelper.WriteLineStringVariable( _
          "strDest", strDest)

        ' Fixieren der Variablen im Speicher, sodass 
        ' sie der Garbage Collector nicht mehr
        ' verschieben kann.
        Dim hgcSource As GCHandle = _
          GCHandle.Alloc(strSource, GCHandleType.Pinned)
        Dim hhcDest As GCHandle = _
          GCHandle.Alloc(strDest, GCHandleType.Pinned)

        Console.WriteLine("Kopieren von strSource über strDest...")

        ' Hier werden die entsprechenden Bytes kopiert. 
        ' Strings bestehen aus Zeichen, die je
        ' 2 Byte lang sind, aus diesem Grund werden 
        ' strSource.Length * 2 Bytes kopiert.
        CopyMemory( _
            hhcDest.AddrOfPinnedObject.ToInt32(), _
            hgcSource.AddrOfPinnedObject.ToInt32(), _
            strSource.Length * 2 _
        )

        CConsoleHelper.WriteLineStringVariable( _
          "strSource", strSource)
        CConsoleHelper.WriteLineStringVariable( _
          "strDest", strDest)

        ' Dem GC wieder erlauben, die Variablen im 
        ' Speicher zu verschieben.
        hgcSource.Free()
        hhcDest.Free()

        Console.WriteLine("*** Beispiel 2")

        Dim x As Integer = 99
        Dim y As Integer = 144
        Console.WriteLine("x = {0}", x)
        Console.WriteLine("y = {0}", y)
        Console.WriteLine("Kopieren des Wertes von y über x...")

        ' Kopieren eines Int32, d.h. 4 Bytes von y nach x.
        CopyMemoryByRef(x, y, 4)

        Console.WriteLine("x = {0}", x)
        Console.WriteLine("y = {0}", y)

        Console.ReadLine()
    End Sub

    Private Class CConsoleHelper
        Public Shared Sub WriteLineStringVariable( _
          ByRef strName As String, _
          ByRef strValue As String)
            Console.WriteLine("{0} = ""{1}""", _
              strName, strValue)
        End Sub
    End Class
End Module

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Reza am 19.03.2009 um 19:01

Kann ich mit dem Code ein Bild im memory einlesen und in einem PictureBox unter VB2008 darstellen? Bin leider ein Anfänger und hab nicht so viel Ahnung davon.
viele grüße und danke

Kommentar von Timo am 11.12.2006 um 00:23

Hallo,
Wenn Du was gefunden hast, waäre ich auch interessiert daran.

Timo

Kommentar von Uwe Biskaborn am 02.01.2006 um 08:20

Hallo,
ich suche ein Blur Algo für VB.Net mit CopyMemory.
Andere Tests waren zu langsam.
So etwas wie der Tipp http://www.activevb.de/tipps/new/vb6tipps/tipp0243.html
in VB.Net.

MfG U.Biskaborn