Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331

    [C] problemi passaggio parametri in DLL

    Salve a tutti.
    Ambiente Visual Studio 2005, opzione di compilazione /TC
    Ho un progetto che produce una DLL e ha:

    una struttura dati cosi' definita:

    codice:
    typedef struct _serialMessage {
     unsigned char lep; 
     unsigned char idt[IDT_LENGHT];
     unsigned char cid[CLUSTER_LENGHT];
     unsigned char lenPayload;
     unsigned char payload[MAX_PAYLOAD_DATA]; 
     unsigned char hotp[HOTP_LEN]; 
     unsigned char lqi; 
     unsigned char rssi; 
    } serialMessage;
    e un metodo cosi' definito:

    codice:
    __declspec(dllexport) int writeMessage(serialMessage msg);
    Il prgetto compila correttamente la DLL che poi viene utilizzata in un altro progetto in cui la struttra dati e' definita come prima mentre il metodo e' dosi' definito e usato:

    codice:
    typedef int (*WRITEMESSAGE)(serialMessage);
    
    WRITEMESSAGE writeMessage = (WRITEMESSAGE)GetProcAddress(hinstLib, L"writeMessage");
    writeMessage(toWrite);
    dove toWrite, ovviamente, e' di tipo serialMessage e hinstLib e' opportunamente definito.
    La funzione writeMessage scrive un log su un file di testo e quello che noto e' che debuggando la toWrite e' correttamente valorizzata mentre nel log della writeMessage (dove i valori salvati nella toWrite vengono usati) mi stampa dei valori sbagliati, tutti a 0 come se nel passaggio come parametro della struttura dati la DLL avesse perso qualcosa.

    Che puo' essere successo?

    Ciao e grazie
    Sandro

  2. #2
    Io espliciterei in entrambi i progetti la convenzione di chiamata della funzione, e mi assicurerei che la struttura e tutte le #define che la influenzano sia perfettamente uguale. Controlla anche se per caso non hai impiegato in un progetto (ma non nell'altro) un #pragma pack prima della dichiarazione della struttura.
    Può essere invece che magari ci sia un problema nella funzione di log: hai collaudato la procedura in questione con dati noti da direttamente dentro il progetto della dll? E ancora, hai provato ad effettuare il debug del codice della dll quando questo viene richiamato dall'eseguibile?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Oltre a quanto sopra, passa le struct per puntatore, non per valore.
    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.

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.