vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Re: Beispiel: Pointer in VB.NET / VarPtr 
Autor: ModeratorDaveS (Moderator)
Datum: 07.11.05 13:05

Also, so heftig kritisieren wollte ich auch nicht wie du das anscheinend empfindest, allerdings was ich gesagt habe stimmt schon. Ich habe nicht behauptet es gäbe gar keine Verwendung für so etwas, und die Lösung ist auch nicht neu im Forum. Allerdings werden sehr sehr wenig Programmierer Debuggers schreiben oder die Notwendigkeit haben Speicher in anderen Programmen anzusprechen, und für solche Anwendungen im Bereich Systemprogrammierung würde ich nie daran denken Vb.Net zu benutzen, und wahrscheinlich gar kein .Net. Lediglich laufen .Net Programme auch als nativer Code unter einem Host, und dieser Host ist auch nicht mit .Net geschrieben, weil es sonst zu einer endlosen Rekursion führen würde. Es gibt ein paar APIs wo man aber solche Zeiger doch braucht.

Dass GCHandle.Free() den Handle freigibt, und die Adresse danach nicht mehr gültig ist kannst du leicht feststellen mit solchem Code
 
        myVar = Encoding.ASCII.GetBytes("Hallo dies ist ein Test")
 
        Dim myGC As GCHandle = GCHandle.Alloc(myVar, GCHandleType.Pinned)
        Dim myVarPointer As IntPtr = myGC.AddrOfPinnedObject()
        myGC.Free()
        Debug.WriteLine("Address: " & myVarPointer.ToInt32().ToString())
 
        GC.Collect()
        GC.WaitForPendingFinalizers()
 
        Dim myGC1 As GCHandle = GCHandle.Alloc(myVar, GCHandleType.Pinned)
        Dim myVarPointer1 As IntPtr = myGC1.AddrOfPinnedObject()
        Debug.WriteLine("Address: " & myVarPointer1.ToInt32().ToString())
        myGC1.Free()
 
        'myGC.Free()
So bekommst du zwei Adressen für die gleiche Variable (dass man den Wert noch aus Speicher richtig auslesen kann ist nur weil kaum etwas in der Anwendung passiert). Mit myGC.Free() am Ende dagegen bekommst du zweimal die gleiche Adresse, weil der Handle inzwischen noch "gepinned" ist. Das Fiese daran ist, dass die Anwendung wahrscheinlich lange richtig läuft, bis eines Tages der unerklärliche Abstürz kommt.

Und solche Beispiele können auch dazu führen, dass VB6 Umsteiger sofort ihre alten VarPtr Tricks mit in die .Net Welt übernehmen, ohne zuerst zu schauen, dass in .Net ziemlich alles anders läuft (oder laufen sollte).

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Beispiel: Pointer in VB.NET / VarPtr2.203Fabian Stern06.11.05 15:41
Re: Beispiel: Pointer in VB.NET / VarPtr1.564Moderatorralf_oop06.11.05 17:30
Re: Beispiel: Pointer in VB.NET / VarPtr1.019Fabian Stern06.11.05 17:40
Re: Beispiel: Pointer in VB.NET / VarPtr1.063ModeratorDaveS06.11.05 17:56
Re: Beispiel: Pointer in VB.NET / VarPtr1.074Fabian Stern07.11.05 10:35
Re: Beispiel: Pointer in VB.NET / VarPtr1.025Fabian Stern07.11.05 10:39
Re: Beispiel: Pointer in VB.NET / VarPtr1.341ModeratorDaveS07.11.05 13:05
Re: Beispiel: Pointer in VB.NET / VarPtr1.047Fabian Stern07.11.05 20:59

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel