Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    VS2010 C++ Comportamento anomalo libreria in una applicazione

    Sto provando a migrare un'applicazione in C++ da VS6.0 a VS2010 .

    Ho questo problema.
    La mia applicazione si compone di 2 parte una GUI ed una libreria. La libreria è costituita da un insieme di classi.

    Se dalla GUI referenzio una classe della libreria ottengo dei risultati strani. Valori astronomici senza senso.
    Se invece prendo fisicamente la classe, della libreria, e la inserisco nel progetto della GUI tutto va bene.

    L'impressione è come se la libreria non venisse linkata correttamente alla GUI, ho visto e rivisto i parametri di compilazione e non ho trovato anomalie anche per il link mi pare tutto nella norma....

    Qualcuno si è trovato in una situazione analoga sa dirmi cosa verificare per il corretto funzionamento del tutto?



  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ma quali errori ottieni esattamente?
    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.

  3. #3
    Refernziando la classe per cui ho delle variabili di ritorno queste non contengono i valori che mi aspetto, ma dei valori esponenziali tipico di aree di memoria sporche o mal referenziate.

    La cosa che mi ha insospettito è che se la classe la tolgo dalla libreria e la metto "fisicamente" nel progetto della GUI i valori che mi torna sono corretti.

    Quindi è come se la libreria o la classe non è "collegata" bene al resto dell'applicazione.
    Non so se sono stato chiaro...

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Probabilmente non lo è. Però se non posti uno stralcio di codice (magari le dichiarazioni delle classi) si possono fare solo ipotesi.
    La prima è che tu per le variabili abbia usato tipi non nativi C e le implementazioni delle librerie a corredo del sistema (MFC, STL etc. specie quest'ultima) sono molto diverse da VC6 a VC2010 (in fondo è passato più di un decennio, il linguaggio evolve e le implementazioni pure). Quindi ricompilando i sorgenti il problema non si pone.
    La seconda (che però non hai confermato) erano problemi di linking, ma da quanto ho capito non è quello il problema.

    Probabilmente è sufficiente ricreare la libreria con VC2010, però se un VC2012 cambia ancora implementazioni di librerie a corredo potresti dover ricompilare.
    Altrimenti dovresti fare come suggerito qui (senza per forza fare una DLL).
    http://chadaustin.me/cppinterface.html
    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.

  5. #5
    La mia applicazione in VC++6.0 si compone di due parti GUI+LibreriaStaticaDaMeCreata

    La libreria statica si trova nella soluzione dell'applicazione, per cui viene compilata contestualmente alla GUI.


    codice:
                //Codice di Test
    
    	StruTabellaComuni *pTC = NULL;
    
    	char   pNome[255];
    	int    RetCode = 0;
    	double V1 = 0.0, V2 = 0.0;
    
    	memset (pNome, '\0', 255);
    	pTC = new StruTabellaComuni ( pNome, &RetCode);
    	pTC->setLatitudine ( 8.8 );
    	V1 = pTC->getLatitudine ();
    
    	pTC->setLongitudine ( 2.2 );
    	V2 = pTC->getLongitudine ();
    La classe StruTabellaComuni abitualmente si trova nella libreria statica da me creata, così i valori che ottengo dall'esempio di prova postato NON sono quelli che mi aspetto.

    Se invece la classe StruTabellaComuni la sposto fisicamente nel progetto della GUI tutto va bene, ottengo V1=8.8, V2=2.2

    La mia sensazione è come se qualcosa va male nel link o nella compilazione per cui non c'è una perfetta corrispondenza nei riferimenti di memoria , ma dai controlli da me eseguiti non ho riscontrato nulla di anomalo.



  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Hai letto il link che ti ho dato?
    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.

  7. #7
    Overview

    This article explains how to create C++ DLL APIs that will work across several compilers and configuration settings (Release, Debug, etc.).
    C'ho dato un'occhiata ma non credo di trovarmi nella situazione descritta.
    Non creo DLL nè tantomeno ho l'esigenza di passare fra compilatori diversi.
    Intendo prodotti di software house distinte. Micorosoft-Borland, ecc ecc

    Sto solo cercando di aggiornare l'ambiente di sviluppo da VC++6.0 a VS2010.


  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Semplificando un pò il discorso del link, lo stesso principio si può applicare anche al funzionamento di una libreria .lib tra versioni diverse dello stesso compilatore (purché l'operazione di linking vada a buon fine).
    In pratica, l'allocazione di memoria dovrebbe farla la libreria tramite una funzione esportata, l'interfaccia della classe che usi dovrebbe essere astratta pura e la memoria dovrebbe essere rilasciata sempre dalla libreria (anche perché gli allocatori sono liberi di usare strategie diverse).

    Questo perché non hai nessuna garanzia che il codice libreria di VC6 sia compatibile con quello di VS2010. Il modo con cui è implementato l'operatore new può essere diverso, influenzando gli offset della classe esposta dalla libreria, per cui ti trovi tutti i valori sballati.
    Detto in parola povere, in C++ non hai garanzie che l'interfaccia della classe che vuoi usare sia esposta nello stesso modo tra le due versioni di VC.
    E la prova è che inserendo il sorgente della classe nel tuo progetto, tutto funzioni normalmente.
    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.

  9. #9
    Il mio sospetto è che ci sia qualcosa che vada settato nei parametri di compilazione e/o link.

    Nell'aggiornamento da VC++6.0 a VS2010 forse perde qualcosa o ha bisogno di qualche esplicitazione che ora a me sfugge.

    Solo così si spiega il fatto che se metto il codice (della classe) fisicamente nel progetto della GUI tutto funziona correttamente.



    Nessuno ha creato un'applicazione composta da più parti e può dirmi a cosa devo stare attento?


  10. #10
    Risoltoooooooooooooooooo

    A beneficio degli altri utenti....

    Nella libreria mancava l'header della classe che referenziavo dalla GUI.
    Così mancava il "modello" di trasferimento dati...

    Il VC++6.0 in qualche modo sopperiva il VS2010 no!
    Mi sarei atteso dal VS2010 qualche messaggio di errore, invece nisba.
    Compiler e Linking zero errori....

    Così se ne sono andati un paio di mesi....

    Vabbè, è proprio vero che a volte la miglior strategia è stare fermi...

    Adesso correggerò il resto. Alla px....

    ATTENTI AGLI HEADER!!!!


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.