| |

VB.NET - FortgeschritteneRe: Beispiel: Pointer in VB.NET / VarPtr | |  | Autor: DaveS (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 |  |
 | 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 |
  |
|
sevISDN 1.0 
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) sevGraph (VB/VBA) 
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|
|
|
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
|
|