Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 20 su 20
  1. #11
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhh

    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  2. #12
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Mi metto anche io in mezzo qui sperando che ripassi shodan.
    Ho una DLL in C++ che deve ritornare ad un codice gestito C# questa struttura

    codice:
    struct RetForManagedCode
    {
    	struct 
    	{
    		wchar_t Number[200];
    		wchar_t Ip[17];
    		wchar_t CPing[5];
    		int Status;
    
    	}TelephoneData[255],NextPhonedata[255];
    
    };
    Andando un pò a naso, ho scritto questo nel codice gestito

    codice:
            [StructLayout(LayoutKind.Auto)]
            public struct PhoneData
            {
                [MarshalAs(UnmanagedType.LPWStr)] string Number;
                [MarshalAs(UnmanagedType.LPWStr)] string Ip;
                [MarshalAs(UnmanagedType.LPWStr)] string Ping;
                [MarshalAs(UnmanagedType.SysInt)] int Status;
    
            };
    
            [StructLayout(LayoutKind.Auto)]
            public struct RetForManagedCode
            {
                public  PhoneData[] TelData;
                public  PhoneData[] NextPhoneData;
            };
    Non posso provarla perchè è un'applicazione Windows Mobile e non ho il palmare a portata di mano ora. Funzionerà?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #13
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Da quel che leggo, l'unico modo per far inter operare i due linguaggi è attraverso COM.
    Se la DLL non lo è, non possono parlarsi.
    Sempre da quel che leggo, la difficoltà maggiore è creare il COM (qui usano ATL), dopo di che si crea un "Runtime Callable Wrapper" e si usa come un normale oggetto C#. L'unica precauzione è usare "Marshall.ReleaseComObject()" sull'oggetto.
    Quindi se si crea il COM funzionante per il C++, poi invocarlo da C# non dovrebbe essere complesso, però ho solo dato un'occhiata al capitolo (come studio ci devo ancora arrivare).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #14
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Non penso che si possa usare solo il COM...altrimenti tutte queste InteropService non servirebbero.

    La DLL funziona se ha void come return e void come parametri. Ma io ho bisogno di scambiare informazioni e fare un file di testo serializzato e poi riparsarlo mi sembra proprio esagerato...
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #15
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Mi correggo: c'è qualcosa sul Platform Invoke riguardo le semplici DLL, ma non è molto chiaro.
    Gli esempi mostrano come mappare una funzione API come CreateFile() ma non parla di come si passa una struttura.
    In ogni caso ho dato solo una scorsa a quel libro fermandomi ai primi capitoli.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #16
    Leggi qui e qui; così ad occhio direi:
    codice:
            [StructLayout(LayoutKind.Auto, CharSet=CharSet.Unicode)]
            public struct PhoneData
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=200))] string Number;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=17)] string Ip;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=5)] string Ping;
                [MarshalAs(UnmanagedType.SysInt)] int Status;
    
            };
    
            [StructLayout(LayoutKind.Auto)]
            public struct RetForManagedCode
            {
                [MarshalAs(UnmanagedType.ByValArray, SizeConst=255)] PhoneData[] TelData;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst=255)]  PhoneData[] NextPhoneData;
            };
    .
    Comunque io fisserei l'ordine degli elementi delle struct sia nel codice C++ che in quello C#, perché non saprei quanto ci si possa fidare del LayoutKind.Auto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #17
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Niente da fare,alla soluzione di MItaly ci ero arrivato anche io.
    Il mapping dei tipi così complicati mi sta letteralmente uccidendo.
    Ricapitoliamo.

    Struttura e funzione Cpp:

    codice:
    struct RetForManagedCode
    {
    	struct 
    	{
    		wchar_t Number[200];
    		wchar_t Ip[17];
    		wchar_t CPing[5];
    		int Status;
    
    	}TelephoneData[255],NextPhonedata[255];
    
    };
    
    extern "C"  __declspec(dllexport) void TrStatus(RetForManagedCode *);
    Come ho fatto in C#

    codice:
            [StructLayout(LayoutKind.Auto, CharSet=CharSet.Unicode)]
            public struct PhoneData
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=200)] string Number;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=17)] string Ip;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=5)] string Ping;
                [MarshalAs(UnmanagedType.SysInt)] int Status;
    
            };
    
            [StructLayout(LayoutKind.Auto)]
            public struct RetForManagedCode
            {
                [MarshalAs(UnmanagedType.ByValArray, SizeConst=255)] public PhoneData[] TelData;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst=255)] public PhoneData[] NextPhoneData;
            };
    
            [DllImport(("\\My Documents\\TrixDLL.dll"), EntryPoint = "TrStatus", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
            public static extern void getTrixData(ref RetForManagedCode ret);
            #endregion

    Uso la funzione così

    codice:
               TrixDLL.RetForManagedCode ret = new TrixDLL.RetForManagedCode();
                ret.NextPhoneData = new TrixDLL.PhoneData[255];
                ret.TelData = new TrixDLL.PhoneData[255];
                
    
                    TrixDLL.getTrixData(ref ret);
    Esasperato dal vedere un risultato funzionante, ho trasformato la funzione in modo che abbia in ingresso un void* da modificare al momento e mappandolo con System.IntPtr.ToPointer().

    La funzione viene eseguita, ma il puntatore rimane comunque 0.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #18
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Neanche così sembra andare.
    Chiederò ai forum microsoft

    codice:
    namespace TrixDLL
    {
        
    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Unicode)]
    public struct PhoneData {
        
        /// wchar_t[200]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=200)]
        public string Number;
        
        /// wchar_t[17]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=17)]
        public string Ip;
        
        /// wchar_t[5]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=5)]
        public string CPing;
        
        /// int
        public int Status;
    }
    
    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct RetForManagedCode {
        
        /// PhoneData[255]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=255, ArraySubType=System.Runtime.InteropServices.UnmanagedType.Struct)]
        public PhoneData[] TelephoneData;
        
        /// PhoneData[255]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=255, ArraySubType=System.Runtime.InteropServices.UnmanagedType.Struct)]
        public PhoneData[] NextPhonedata;
    }
    
    public partial class NativeMethods {
        
        /// Return Type: void
        ///param0: RetForManagedCode*
        [System.Runtime.InteropServices.DllImportAttribute("\\My Documents\\TrixDLL.dll", EntryPoint = "TrStatus")]
    public static extern  void TrStatus(ref RetForManagedCode param0) ;
    
    }
    
    }
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #19
    Se specifichi CallingConvention.Winapi nel codice C++ devi specificare stdcall come convenzione di chiamata.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #20
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Lo pensavo anche io ma

    E io mi trovo proprio su Windows CE.NET.
    Lo stesso metodo funziona perfettamente se è del tipo void foo();
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.