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

 

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

Reference σε βιβλιοθήκη

Îåêßíçóå áðü ôï ìÝëïò geoneo. Τελευταία δημοσίευση από το μέλος geoneo στις 04-02-2012, 12:47. Υπάρχουν 21 απαντήσεις.
Σελίδα 2 από 2 (22 εγγραφές)   < 1 2
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  01-02-2012, 11:45 69095 σε απάντηση της 69093

    Απ: Reference σε βιβλιοθήκη

    Μάρκο πρόσεξε λίγο πως έχει δηλωθεί μέσα στην struct

    για παράδειγμα το

    char dateStr[16];

    ενώ στη vb έχει δηλωθεί 

    Dim dateStr As String

    στη πρώτη περίπτωση έχει δεσμεύσει χώρο 16 char

    ενώ στη δεύτερη ??

    οπότε στην κλήση υπάρχει πρόβλημα με το alocation... και χτυπάει..


    βρήκα και ένα άλο τρόπο δήλωσης της struct , και θα τον δοκιμάσω το το βράδυ...

    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
    public struct WeatherRecordStruct
        {

            [FieldOffset(0)]
            public short year;

            [FieldOffset(16)]
            public byte month;
            [FieldOffset(23)]
            public byte day;

            [FieldOffset(30)]
            public short packedTime;
            [FieldOffset(45)]
            public char dateStr;
            [FieldOffset(60)]
            public char timeStr;
            .........
    }

     

     

  •  01-02-2012, 11:47 69096 σε απάντηση της 69092

    Απ: Reference σε βιβλιοθήκη

    nikos123:
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            byte[] dateStr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            byte[] timeStr;
      Το char στην c είναι 1 byte, στην c# 2 bytes.
    Ενδιαφέρων ... μπορείς να μου δώσεις ολόκληρη τη δήλωση πως θα γίνει.??...
     
     
  •  01-02-2012, 12:40 69097 σε απάντηση της 69096

    Απ: Reference σε βιβλιοθήκη

    Μόνο στα πεδία array έκανα αλλαγές. 
    CharSet.Ansi για ισοδυναμία char στις c και c#.
    Επίσης char[] και string είναι το ίδιο.
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct WeatherRecordStruct
        {
            short year;
            char month;
            char day;
            short packedTime;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
            string dateStr;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
            string timeStr;
            float heatIndex;
            float windChill;
            float hiOutsideTemp;
            float lowOutsideTemp;
            float dewPoint;
            float windSpeed;
            short windDirection;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
            string windDirectionStr;
        }

    edit :
    Όταν έχουμε array από char θέλει ByValTStr αντί ByValArray.




  •  01-02-2012, 16:13 69100 σε απάντηση της 69097

    Απ: Reference σε βιβλιοθήκη

    nikos123:
    Μόνο στα πεδία array έκανα αλλαγές. 
    CharSet.Ansi για ισοδυναμία char στις c και c#.
    Επίσης char[] και string είναι το ίδιο.
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct WeatherRecordStruct
        {
            short year;
            char month;
            char day;
            short packedTime;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
            string dateStr;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
            string timeStr;
            float heatIndex;
            float windChill;
            float hiOutsideTemp;
            float lowOutsideTemp;
            float dewPoint;
            float windSpeed;
            short windDirection;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
            string windDirectionStr;
        }

    edit :
    Όταν έχουμε array από char θέλει ByValTStr αντί ByValArray.


     

    Δούλεψε μιά χαρά ευχαριστώ...

     

  •  03-02-2012, 22:27 69121 σε απάντηση της 69100

    Απ: Reference σε βιβλιοθήκη

    Καλησπέρα και πάλι..

    Υπάρχει μια function στην dll που δηλώνεται ως εξής :

    char* GetWindDirStr_V (char* dirStr)

    προσπαθώ να την καλέσω απο c#

    κάποιες φορές δουλεύει , αλά τις περισότερες χτυπάει σε run time με μύνημα

    "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

    Την function σε c# την έχω δηλώσει ώς εξής :

    [DllImport("VantagePro.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern StringBuilder GetWindDirStr_V([MarshalAs(UnmanagedType.LPStr)] StringBuilder dirStr);

    και στον κώδικα που την καλώ...

    StringBuilder WindDirStr = new StringBuilder(100);

    StringBuilder DirStr = new StringBuilder(100);

    WindDirStr =  VantageProDll.GetWindDirStr_V(DirStr);

     

    Υπάρχει καμιά καλύτερη ιδέα ?

    Ευχαριστώ...

     

    Γιώργος Νικολιδάκης

     

     

  •  04-02-2012, 10:17 69122 σε απάντηση της 69121

    Απ: Reference σε βιβλιοθήκη

    Ο τύπος StringBuilder που επιστρέφει γίνεται garbage collected. Πρέπει να επιστρέφει IntPtr. 
    

    [DllImport("VantagePro.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr GetWindDirStr_V([MarshalAs(UnmanagedType.LPStr)] StringBuilder dirStr);
    InrPtr ptr=VantageProDll.GetWindDir(DirStr);
    string windDirStr=Marshal.PtrToStringAnsi(ptr);


  •  04-02-2012, 12:47 69123 σε απάντηση της 69122

    Απ: Reference σε βιβλιοθήκη

    nikos123:
    Ο τύπος StringBuilder που επιστρέφει γίνεται garbage collected. Πρέπει να επιστρέφει IntPtr. 
    

    [DllImport("VantagePro.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr GetWindDirStr_V([MarshalAs(UnmanagedType.LPStr)] StringBuilder dirStr);
    InrPtr ptr=VantageProDll.GetWindDir(DirStr);
    string windDirStr=Marshal.PtrToStringAnsi(ptr);




    Τι να πώ.. ! δουλεύει ....Ευχαριστώ...!!!
    Να δείς που στο τέλος θα μάθω να δουλεύω με unmanaged dll's  .!!





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