Re: "AS ANY" Problem mit MoveMemory Funktion

Tech-Archive recommends: Fix windows errors by optimizing your registry

From: Thomas Scheidegger [MVP] (spam.netmaster_at_swissonline.ch)
Date: 06/29/04


Date: Tue, 29 Jun 2004 17:13:22 +0200

Hallo Udo

> Nach der Konvertierung meines Projektes in VB.NET kann ich die Deklaration "as any" nicht mehr verwenden.
> Folgende Deklaration war in VB6 noch gültig:
> Private Declare Sub MoveMemory Lib "kernel32" Alias
> "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

API-Declares aus VB6 sind in .NET -IMMER- zu überarbeiten.
  (Die API-Konvertierungen wären IMHO sowieso fragwürdig)

Nun, gerade das 'MoveMemory' - API macht unter
.NET oft gar keinen Sinn mehr,
kann man meist besser mit anderem Ansatz oder der Marshal-Klasse lösen.

Meistens ist das 'MoveMemory' zwischen
zwei (oder mehr) anderen API-Calls eingefügt.
Nicht selten sogar fast nutzlos.

Wenn du uns also etwas mehr zum 'Umfeld' sagst,
schaut evtl. eine viel modernere (.NET) Lösung heraus...

> PVOID und const VOID* konvertiere

dies sind in C++ irgendwelche (untypisierte) Pointer,
hängt eben vom Umfeld / Situation ab.
.NET ist viel strikter, man muss
da die Lage jedesmal genau analysieren, sonst
hat man Leaks oder Crash (u.U. an ganz anderer Stelle!)

Eine erste Möglichkeit [1:1 Ersatz zu VB6] wäre etwa:

  <MarshalAs(UnmanagedType.AsAny)> ByVal x As Object
  <MarshalAs(UnmanagedType.AsAny)> ByRef y As Object

aber bitte nicht einfach 'probieren' welches geht...
  -> in MSDN über Marshaling lesen.

-- 
 Thomas Scheidegger - MVP .NET - 'NETMaster'
 http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/