ERLEDIGT
NEIN
NEIN
ANTWORTEN
13
13
ZUGRIFFE
770
770
EMPFEHLEN
-
Hallo,
Ich arbeite an eine Anwendung, die shared memory auslesen soll. Um das via Memory Mapped File zu machen, müssen viele aufrufe von kernel32.dll implementiert werden.
Hier ist eine der Funktionen (in VB):
Private Declare Sub CopyMemoryRead Lib "kernel32" Alias "RtlMoveMemory" ( _
pDst As Any, _
ByVal Src As Long, _
ByVal ByteLen As Long)
Wie kann man diesen Aufruf in C# umschreiben?
Mein versuch funktioniert leider nicht, da ich nicht weiß was man an stelle "As any" in C# nehmen soll
[DllImport ("kernel32", SetLastError=true)]
public static extern void CopyMemoryRead (long Dst , long pSrc,long ByteLen);
Vielen Dank,
Zero_Base
-
Fang selber auch grad mit der Win32 API an. Hab gestern aber einen heißen Tipp vom Alex bekommen,
wo man sich diesbezüglich informieren kann.
Guck mal hier rein: Win32 API - Handle auf ein String Objekt? - Thread
Pinvoke lässt sich auch in das VS 2005 integrieren... afaik
MfG,
cosmoMfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
Danke für den Tipp, Cosmo.
Bei pinvoke.net habe ich schon gesucht und leider nix zu CopyMemoryRead gefunden
-
Guck mal hier rein: Mit C# arbeiten - Verwenden von Win32 und anderen Bibliotheken
Vielleicht findest Du dort brauchbare Infos. Denke mal das pDst As Any
vermutlich in die Richtung "variant" geht.
Aber der Alex ist ein Crack in der Win32 API. Evtl. weiss er wie das geschrieben werden muss...
MfG,
cosmoMfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
06.04.06 14:19 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Der richtige Typ um einen Pointer bzw. Handle zu repräsentieren (sowohl in VB.NET also auch C#) ist IntPtr.
Siehe http://www.pinvoke.net/default.aspx/...oveMemory.html
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Es klappt aber trotzdem nicht..........
public static extern void CopyMemoryRead (IntPtr Dst, IntPtr pSrc, long ByteLen);
[StructLayout(LayoutKind.Sequential,Pack = 1, CharSet = CharSet.Unicode)]
public struct MyData
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=11)]
public char[] strName;
[MarshalAs( UnmanagedType.ByValArray,SizeConst = 16)]
public char[] strID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
public char[] strDatum;
}
IntPtr addressOfStructure1 = Marshal.AllocHGlobal(40);
CopyMemoryRead (Marshal.StructureToPtr(this.myData,this.addressOfStructure1,true), myMBMMem, 1024);
Dabei kriege ich ein Fehler: void kann nicht zu einem IntPtr konvertiert werden. Wie soll ich meine Structur in IntPtr umwandeln? was mache ich falsh?
Vielen Dank in voraus,
Zero_Base
-
10.04.06 10:29 #7
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Die Methode Marshal.StructureToPtr gibt nichts (void) zurück.
Aus dem MSDN http://windowssdk.msdn.microsoft.com..._ffb40adb.asp:Der 3. Parameter gibt übrigens an ob das alte Objekt gelöscht werden soll oder nicht.Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
public struct Point { public int x; public int y; } class Example { static void Main() { // Create a point struct. Point p; p.x = 1; p.y = 1; Console.WriteLine("The value of first point is " + p.x + " and " + p.y + "."); // Initialize unmanged memory to hold the struct. IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(p)); try { // Copy the struct to unmanaged memory. Marshal.StructureToPtr(p, pnt, false); // Create another point. Point anotherP; // Set this Point to the value of the // Point in unmanaged memory. anotherP = (Point)Marshal.PtrToStructure(pnt, typeof(Point)); Console.WriteLine("The value of new point is " + anotherP.x + " and " + anotherP.y + "."); } finally { // Free the unmanaged memory. Marshal.FreeHGlobal(pnt); }
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Vielen Dank für die Antwort, deepthroat!!
Es funktioniert leider auch nicht:
IntPtr buffer= Marshal.AllocHGlobal(Marshal.SizeOf(myData));
Point p;
Marshal.StructureToPtr(this.myData,buffer,true);
p=(Point)Marshal.PtrToStructure(buffer, typeof(MyData));
Bei der letzten Zeile kriege ich eine Fehlermeldung : Specified cast is not valid.
Zero_Base
-
10.04.06 11:06 #9
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Das war doch nur ein Beispiel direkt aus dem MSDN. Du mußt natürlich überall statt Point deine Struktur MyData da einsetzen:
Code :1 2 3 4 5
IntPtr buffer= Marshal.AllocHGlobal(Marshal.SizeOf(myData)); Marshal.StructureToPtr(this.myData,buffer,true); myData = (MyData)Marshal.PtrToStructure(buffer, typeof(MyData)); Marshal.FreeHGlobal(buffer);
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Kriege immer noch ein Fehler:
CopyMemoryRead (myData, myMBMMem, buffer.ToInt32());
Fehlermeldung sagt aus, dass myData kann nicht zu System.IntPtr umgewandelt wetden
-
10.04.06 11:49 #11
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Statt myData mußt du im Aufruf der Funktion natürlich buffer verwenden.
Ich weiß ja nicht was myMBMMem ist, aber vermutlich sollte das eher so aussehen:Code :1
CopyMemoryRead (buffer, myMBMMem, Marshal.SizeOf(myData));
Gruß
PS: Und verwende doch bitte die Code Tags.If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Also jetzt läuft alles, nur liefert keine Daten nach dem kopieren

Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
private static extern uint CopyMemory ([MarshalAs(UnmanagedType.AsAny)] object Destination, IntPtr Source, int Length); IntPtr file; IntPtr myMBMMem=IntPtr.Zero; file=OpenFileMapping(FILE_MAP_READ,false, "TestMemory"); if (file==IntPtr.Zero) { MessageBox.Show("Memory could not be open"); } else myMBMMem=MapViewOfFile (file,FILE_MAP_READ,0,0,0); CopyMemory (myData, myMBMMem, Marshal.SizeOf(myData)); MessageBox.Show(myData.strName.ToString());
Beim MessageBox.Show gibt es immer ein Fehler "Object Reference not set to an instanz of object.
-
Du hast die geschweiften Klammern vergessen.
Zitat von Zero_Base
Debugge das ganze und schau Dir die Struktur genauer an.Code :1 2 3 4 5 6 7 8
if ( file == IntPtr.Zero ) { MessageBox.Show( "Memory could not be open" ); } else [COLOR="Red"]{[/COLOR] myMBMMem = MapViewOfFile ( file, FILE_MAP_READ,0,0,0 ); CopyMemory ( myData, myMBMMem, Marshal.SizeOf(myData) ); MessageBox.Show( myData.strName.ToString() ); [COLOR="Red"]}[/COLOR]
War jetzt das Property null oder die Strukur selber?...
Raten können wir nicht.MfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
@cosmo
Uppss, dankeDu hast die geschweiften Klammern vergessen
es ist die Property die kein wert hat, nicht die struktur.Geändert von Zero_Base (10.04.06 um 15:59 Uhr)
Ähnliche Themen
-
Kernel32 ?
Von yunses im Forum .NET CaféAntworten: 5Letzter Beitrag: 27.08.08, 09:27 -
Funktionen in kernel32.dll / user32.dll
Von eeemoh im Forum .NET CaféAntworten: 1Letzter Beitrag: 19.11.07, 12:37 -
Kernel32.lib
Von lernen.2007 im Forum C/C++Antworten: 3Letzter Beitrag: 16.11.06, 19:30 -
Abstürz von wegen Kernel32.dll
Von lalala123 im Forum C/C++Antworten: 1Letzter Beitrag: 30.03.05, 15:11 -
kernel32.dll & Visual C++ Fehler
Von pycak im Forum C/C++Antworten: 8Letzter Beitrag: 15.05.04, 20:03





Zitieren
Login





