tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
770
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Zero_Base Zero_Base ist offline Mitglied Bronze
    Registriert seit
    Aug 2005
    Beiträge
    45
    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
     

  2. #2
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    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,
    cosmo
     
    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...

  3. #3
    Zero_Base Zero_Base ist offline Mitglied Bronze
    Registriert seit
    Aug 2005
    Beiträge
    45
    Danke für den Tipp, Cosmo.

    Bei pinvoke.net habe ich schon gesucht und leider nix zu CopyMemoryRead gefunden
     

  4. #4
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    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,
    cosmo
     
    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...

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  6. #6
    Zero_Base Zero_Base ist offline Mitglied Bronze
    Registriert seit
    Aug 2005
    Beiträge
    45
    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
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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:
    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);
            }
    Der 3. Parameter gibt übrigens an ob das alte Objekt gelöscht werden soll oder nicht.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    Zero_Base Zero_Base ist offline Mitglied Bronze
    Registriert seit
    Aug 2005
    Beiträge
    45
    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
     

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  10. #10
    Zero_Base Zero_Base ist offline Mitglied Bronze
    Registriert seit
    Aug 2005
    Beiträge
    45
    Kriege immer noch ein Fehler:


    CopyMemoryRead (myData, myMBMMem, buffer.ToInt32());

    Fehlermeldung sagt aus, dass myData kann nicht zu System.IntPtr umgewandelt wetden
     

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  12. #12
    Zero_Base Zero_Base ist offline Mitglied Bronze
    Registriert seit
    Aug 2005
    Beiträge
    45
    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.
     

  13. #13
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Zitat Zitat von Zero_Base
    Beim MessageBox.Show gibt es immer ein Fehler "Object Reference not set to an instanz of object.
    Du hast die geschweiften Klammern vergessen.
    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]
    Debugge das ganze und schau Dir die Struktur genauer an.
    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...

  14. #14
    Zero_Base Zero_Base ist offline Mitglied Bronze
    Registriert seit
    Aug 2005
    Beiträge
    45
    @cosmo

    Du hast die geschweiften Klammern vergessen
    Uppss, danke

    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

  1. Kernel32 ?
    Von yunses im Forum .NET Café
    Antworten: 5
    Letzter Beitrag: 27.08.08, 09:27
  2. Funktionen in kernel32.dll / user32.dll
    Von eeemoh im Forum .NET Café
    Antworten: 1
    Letzter Beitrag: 19.11.07, 12:37
  3. Kernel32.lib
    Von lernen.2007 im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 16.11.06, 19:30
  4. Abstürz von wegen Kernel32.dll
    Von lalala123 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 30.03.05, 15:11
  5. kernel32.dll & Visual C++ Fehler
    Von pycak im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 15.05.04, 20:03