Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

SafeFileHandle και IntPtr σε FileStream σε .NETCF

Îåêßíçóå áðü ôï ìÝëïò mixio. Τελευταία δημοσίευση από το μέλος mixio στις 08-12-2008, 15:31. Υπάρχουν 13 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  20-11-2008, 17:40 46385

    SafeFileHandle και IntPtr σε FileStream σε .NETCF

    Απ' οτι φαινεται οι constructor της Filestream για NETCF δεν εχουν περιπτωση για να περνει ως παραμετρο ενα IntPtr.

    Θελω να ανοιξω για Read/Write ενα Tun interface και αυτο το κανω σωστα με τον παρακατω κωδικα.

    IntPtr ptr = CreateFile("\\\\.\\Global\\" + devGuid + ".tap", FileAccess.ReadWrite....................);

    Το προβλημα ειναι οτι ο παραπανω κωδικας επιστρεφει εναν IntPtr οπως βλεπετε.
    Πως θα συνδεσω τωρα καποιο stream σε αυτον τον pointer;

    Αν ημουν σε NET κανονικη θα το εκανα καπως ετσι.
    new FileStream(ptr, FileMode.Open);



    Sleep-deprived psychotic hacker

  •  01-12-2008, 01:27 46595 σε απάντηση της 46385

    Απ: Filestream σε NETCF

    Από ότι φαίνεται από το path που προσπαθείς να κάνεις access, αυτό που προσπαθείς να ανοίξεις είναι ένα pipe. Προσπάθησες να χρησιμοποιήσεις την αντίστοιχη κλάσεις που υπάρχουν στο System.IO.Pipes του .NET Framework;

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  07-12-2008, 17:07 46762 σε απάντηση της 46595

    Απ: Filestream σε NETCF

    Φιλε μου στο .NETCF δεν εχει System.IO.Pipes Sad

    Sleep-deprived psychotic hacker

  •  07-12-2008, 19:15 46765 σε απάντηση της 46385

    Απ: Filestream σε NETCF

    Απ' ότι φαίνεται κι αυτοί έχουν το ίδιο πρόβλημα. Μάλλον θα πρέπει να εγκαταλείψεις την FileStream και να χρησιμοποιήσεις PInvole. Ορίστε τα signatures για CreateFile και ReadFile.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  07-12-2008, 23:14 46768 σε απάντηση της 46765

    Απ: Filestream σε NETCF

    Απ'οτι βλεπω η ReadFile δεχεται μονο IntPtr.
    Επιστρεφω SafeFileHandle στην CreateFile γιατι καπου διαβασα οτι ο IntPtr εχει ξεπεραστει.
    Υπαρχει περιπτωση η ReadFile να δεχεται SafeFileHandle ;
    Ακομα και ο compiler βγαζει warning οτι ο IntPtr ειναι ξεπερασμενος σε .NET 2
    Το λεει και στην σελιδα που με εδωσες για την ReadFile:
    "NET 2.0 use SafeFileHandle instead of IntPtr"
     

    Sleep-deprived psychotic hacker

  •  08-12-2008, 00:25 46770 σε απάντηση της 46768

    Απ: Filestream σε NETCF

    Κάτσε τώρα γιατί κάπου μπερδεύτηκα. Είναι και η ώρα περίεργη... Εδώ λέει ότι το signature της CreateFile είναι:

    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern IntPtr CreateFile(
       string fileName,
       [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
       [MarshalAs(UnmanagedType.U4)] FileShare fileShare,
       IntPtr securityAttributes,
       [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
       int flags,
       IntPtr template);

    Απλά στο .NET 2.0 γίνεται (ίδια πηγή):

    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
     public static extern SafeFileHandle CreateFile(
            string fileName,
            [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
            [MarshalAs(UnmanagedType.U4)] FileShare fileShare,
            IntPtr securityAttributes,
            [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
            [MarshalAs(UnmanagedType.U4)] FileAttributes flags,
            IntPtr template);

    Όπως λέει και στο link της ReadFile:

    Tips & Tricks:

    NET 2.0 use SafeFileHandle instead of IntPtr

    Ποιο ακριβώς είναι το πρόβλημα; Στο .NET 2.0 περνάς σαν παράμετρο το SafeFileHandle, εφόσον το ορίσεις στο signature της ReadFile, αντί του IntPtr. Αυτό καταλαβαίνω από την πηγή που σου έδωσα. Αν υπάρχει κάτι άλλο που δεν το αναφέρουν, τότε... Δοκίμασέ το έτσι και αν δε δουλέψει τότε άλλαξέ το και δοκίμασε με IntPtr.

    Στο αρχικό σου post, η CreateFile επέστρεφε IntPtr και εκεί γινόταν όλο το μπλέξιμο. Το ωραίο είναι ότι ο constructor της FileStream είναι overloaded και δέχεται σα παράμετρο το SafeFileHandle object, αλλά όχι στο CF!


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  08-12-2008, 00:30 46771 σε απάντηση της 46768

    Απ: Filestream σε NETCF

    Λοιπον, χρησιμοποιησα την ReadFile ως εξης:
     
    [DllImport("kernel32.dll")]
    static extern bool ReadFile(
    IntPtr hFile,
    byte[] lpBuffer,
    uint nNumberOfBytesToRead,
    out uint lpNumberOfBytesRead,
    IntPtr lpOverlapped );

    και διαβασα ως εξης:

                uint BytesRead = 0;
                byte[] BufBytes = new byte[64 * 1024];
                if (ReadFile(TunHandle, BufBytes, (uint)BufBytes.Length, out BytesRead, IntPtr.Zero))
                {
                    byte[] OutBytes = new byte[BytesRead];
                    Array.Copy(BufBytes, OutBytes, (int)BytesRead);
                    Console.WriteLine("Read: "+BytesRead);
                    return OutBytes;
                }
                else
                {
                    Console.WriteLine("Read: Nothing");
                    return null;
                }

    Δυστυχως δε διαβαζει τπτ. Κανω κατι λαθος;

    Sleep-deprived psychotic hacker

  •  08-12-2008, 00:36 46772 σε απάντηση της 46770

    Απ: Filestream σε NETCF

    Στο ανεφερα το SafeFileHandle γιατι στο NETCF δεν υπαρχει τετοιο πραμα.
    Πρεπει να σεταρεις το OpenNETCF για να εχεις και SafeFileHandle.
    Αλλα δεν ειναι εδω το προβλημα.

    Sleep-deprived psychotic hacker

  •  08-12-2008, 00:45 46773 σε απάντηση της 46771

    Απ: Filestream σε NETCF

    Η ReadFile() έχει τέσσερα signatures. Μήπως πρέπει να χρησιμοποιήσεις κάποιο άλλο;
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  08-12-2008, 00:49 46774 σε απάντηση της 46773

    Απ: Filestream σε NETCF

    Εχει σημασια ποιο απο τα τεσσερα θα χρησιμοποιηθει ;

    Sleep-deprived psychotic hacker

  •  08-12-2008, 00:54 46775 σε απάντηση της 46774

    Απ: Filestream σε NETCF

    Τι να σου πω... Το ψάχνω μαζί σου. Σε άλλο thread είδα ότι αναφέρεσαι στον tun driver. Προφανώς εκεί παίζεις τώρα. Το documentation δε λέει κάτι για το πως κάνεις access;
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  08-12-2008, 01:15 46776 σε απάντηση της 46775

    Απ: Filestream σε NETCF

    Ε, προσπαθω να διαβασω bytes.
    Με την FileStream ολα δουλευαν ρολοι. Απλα ο καθηγητης θελει για PDA και σε PDA αλλαζουν τα πραματα Sad

    Εχω βρει απο το source του openvpn οτι για ReadFile εχει αυτο:

    ReadFile(
                  tt->hand,
                  BPTR (&tt->reads.buf),
                  len,
                  &tt->reads.size,
                  &tt->reads.overlapped
    );



    Sleep-deprived psychotic hacker

  •  08-12-2008, 01:49 46777 σε απάντηση της 46776

    Απ: Filestream σε NETCF

    Τι να σου πω... Μέχρι τώρα κοίταζα στο site του openvpn μήπως βρω κάτι. Ίσως θα πρέπει να κάνεις ένα post στο οικείο forum του openvpn ή/και να τους στείλεις κάποιο email. Εκτός αν αύριο με πιο καθαρό μυαλό βρεθεί η λύση.
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  08-12-2008, 15:31 46780 σε απάντηση της 46777

    Απ: Filestream σε NETCF

    Το θεμα επιτελους λυθηκε.

    Tα signatures για ανοιγμα, διαβασμα και γραψιμο:

            [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            static extern IntPtr CreateFile(
                string filename,
                [MarshalAs(UnmanagedType.U4)]FileAccess fileaccess,
                [MarshalAs(UnmanagedType.U4)]FileShare fileshare,
                IntPtr securityattributes,
                [MarshalAs(UnmanagedType.U4)]FileMode creationdisposition,
                uint flags,
                IntPtr template
            );

            [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            static extern bool ReadFile(
                IntPtr hFile,
                byte[] lpBuffer,
                int nNumberOfBytesToRead,
                out int lpNumberOfBytesRead,
                IntPtr lpOverlapped
            );

            [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            static extern bool WriteFile(
                IntPtr hFile,
                byte[] lpBuffer,
                int nNumberOfBytesToWrite,
                out int lpNumberOfBytesWritten,
                IntPtr lpOverlapped
            );

    Ο κωδικας για το ανοιγμα, διαβασμα και γραψιμο:
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------

               IntPtr TunHandle = CreateFile(
                           "file",
                           FileAccess.ReadWrite,
                           FileShare.ReadWrite,
                           IntPtr.Zero,
                           FileMode.Open, 
                           (uint)FileAttributes.Normal,
                           IntPtr.Zero);
    --------------------------------------------------------------------------------
                int BytesRead = 0;
                byte[] BufBytes = new byte[64 * 1024];
                if (ReadFile(TunHandle, BufBytes, BufBytes.Length, out BytesRead, IntPtr.Zero))
                {
                    Console.WriteLine("Read: " + BytesRead);
                    byte[] OutBytes = new byte[BytesRead];
                    Array.Copy(BufBytes, 0, OutBytes, 0, BytesRead);
                    return OutBytes;
                }
                else
                {
                    return null;
                }
    --------------------------------------------------------------------------------
                byte[] packet = new byte[data.Length];
                Array.Copy(data, 0, packet, 0, data.Length);
                int BytesWritten = 0;
                if (WriteFile(TunHandle, packet, packet.Length, out BytesWritten, IntPtr.Zero))
                {
                    Console.WriteLine("Write: " + BytesWritten);
                }
                else
                {
                    Console.WriteLine("could not write");
                }      

    To λαθος ηταν στην CreateFile στην οποια περνουσα παραμετρο  FILE_ATTRIBUTE_SYSTEM|FILE_FLAG_OVERLAPPED ενω διαβαζα ως non-overlapped. Οποτε εβαλα για παραμετρο FILE_ATTRIBUTE_NORMAL και ολα δουλεψαν ρολοι.
    Αυτη την πληροφορια τη βρηκα χαρη σε σενα Markos στο link που με εδωσες πριν.
    Να' σαι καλα.
    Οποτε αυτη ειναι η λυση και στο TOPIC.

    Sleep-deprived psychotic hacker

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems