Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C#] dll entry point

  1. #1
    Utente di HTML.it L'avatar di deedlyt
    Registrato dal
    Jan 2002
    Messaggi
    444

    c# .. dll entry point

    Buonasera a tutti
    io dovrei chiamare una funzione all'interno di una dll che non è stata compilata e creata in ambiente .net. la funzione è la seguente

    codice:
    ZLNET_API LONG CALL_METHOD ZLNET_Login(char *pchDVRIP, WORD wDVRPort, char *pchUserName, char *pchPassword, LPZLNET_DEVICEINFO lpDeviceInfo, int *error = 0);

    che è stata convertita e chiamata nel seguente modo:
    codice:
        public struct NET_DEVICEINFO
        {
            public char[] sSerialNumber;
            public byte byAlarmInPortNum;
            public byte byAlarmOutPortNum;
            public byte byDiskNum;
            public byte byDVRType;
            public byte byChanNum;
        }
    
        public struct NET_RET_ERROR
        {
            public short errcode;
        }
    
    
                [DllImport("zlnetsdk.dll", CharSet = CharSet.Unicode)]
                public static extern Int32 ZLNET_Login(string pchDVRIP, Int16 wDVRPort, string pchUserName, string pchPassword, ref NET_DEVICEINFO lpDeviceInfo, NET_RET_ERROR ierror);
    
    ....
    
    public bool Connect()
                {
                        Int32 hLoginId;
                        string my_server;
                        string my_user;
                        string my_pass;
                        Int16 my_port;
    
                        my_server = "10.10.20.89";
                        my_port = 8000;
                        my_user = "user1";
                        my_pass = "123456";
    
      hLoginId = ZLNET_Login(my_server, my_port, my_user, my_pass, ref devInfo, error_Renamed);
    }
    non so dove sbaglio, ma mi sembra che non fa la login o non entra proprio nella dll.

    Qualcuno mi sa aiutare?

    Grazie

  2. #2
    Qual è la dichiarazione originale ("lato C") di NET_DEVICEINFO? Dove sono dichiarazione ed inizializzazione di devInfo a "lato C#"? Tra parentesi, anche per l'ultimo parametro devi specificare ref nella dichiarazione.

    P.S.: le discussioni relative a C# non sono trattate qui, ma nella sezione Visual Basic e .Net Framework; provvedo a spostare il thread.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di deedlyt
    Registrato dal
    Jan 2002
    Messaggi
    444
    codice:
    typedef struct
    {
    	BYTE				sSerialNumber[ZLNET_SERIALNO_LEN];	
    	BYTE				byAlarmInPortNum;		
    	BYTE				byAlarmOutPortNum;		
    	BYTE				byDiskNum;				
    	BYTE				byDVRType;				
    	BYTE				byChanNum;				
    } ZLNET_DEVICEINFO, *LPZLNET_DEVICEINFO;

  4. #4
    Allora da "lato C#" la dichiarazione deve essere:
    codice:
        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
        public struct NET_DEVICEINFO
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst=ZLNET_SERIALNO_LEN)]
            public string sSerialNumber;
            public byte byAlarmInPortNum;
            public byte byAlarmOutPortNum;
            public byte byDiskNum;
            public byte byDVRType;
            public byte byChanNum;
        }
    se questo numero seriale va trattato come una stringa, oppure
    codice:
        public struct NET_DEVICEINFO
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst=ZLNET_SERIALNO_LEN)]
            public byte[] sSerialNumber;
            public byte byAlarmInPortNum;
            public byte byAlarmOutPortNum;
            public byte byDiskNum;
            public byte byDVRType;
            public byte byChanNum;
        }
    se va trattato come una sequenza di byte.

    (naturalmente tutto questo dopo aver definito ZLNET_SERIALNO_LEN con il valore copiato dagli header C originali)
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di deedlyt
    Registrato dal
    Jan 2002
    Messaggi
    444
    Grazie mille intanto per il prezioso aiuto MItaly...

    Però ho un secondo problema..
    la definizione di ZLNET_SERIALNO_LEN nel mio codice c++ è il seguente:

    codice:
    #define ZLNET_SERIALNO_LEN 			    48
    è giusto convertirlo in c# cosi?
    codice:
            public const int ZLNET_SERIALNO_LEN = 48;
    grazie mille in anticipo

  6. #6
    Utente di HTML.it L'avatar di deedlyt
    Registrato dal
    Jan 2002
    Messaggi
    444
    può essere che io sbaglio nel registrarla o inserirla nella cartella systme32 o deve essere inserita in una cartella specifica??

  7. #7
    Originariamente inviato da deedlyt
    è giusto convertirlo in c# cosi?
    codice:
            public const int ZLNET_SERIALNO_LEN = 48;
    Sì.
    può essere che io sbaglio nel registrarla o inserirla nella cartella systme32 o deve essere inserita in una cartella specifica??
    Se è una dll "normale" (non COM) come sembra non dovrebbe essere necessario; inoltre, se non ottieni alcun messaggio di errore riguardo a dll non trovate non dovresti avere un problema di percorsi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8

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 © 2025 vBulletin Solutions, Inc. All rights reserved.