Vai al contenuto
PLC Forum


Prototipi Vc++


drugo66

Messaggi consigliati

Salve a tutti,

inizio oggi a postare un serie di classi e funzioni VC++ con l'ausilio della libreria MFC (che chiamo prototipi) che utilizzo nelle mie applicazioni; il compilatore che uso è un po' datato (versione 6), ma, con alcuni prototipi, ho testato l'utilizzo con compilatore più recenti e, a parte alcuni avvisi per l'utilizzo di funzioni di manipolazione stringhe che sono stati aggiornate nel tempo (quindi bastarebbe utilizzare la funzione replace dell'IDE), non ho notato particolari problemi.

Spesso e quando possibile, ho inserito una applicazione di prova della classe, altrimenti sono presenti solo i file di definizione (.h), di implementazione (.cpp) ed un file di commenti (.txt); quest'utlimo file è in italiano, mentre i commenti all'interno degli atri file sono in inglese (almeno, nel "mio" inglese ...); quando è presente l'applicazione di prova, ho escluso dal file zippato, per questioni di spazio, le cartelle di debug e release, quindi occorre almeno un compilatore e la capacità di utlizzarlo.

In ogni caso, nel folder radice del file zippato, sono sempre presenti tutti i file per l'utilizzo del prototipo; se il prototipo necessita di risorse (dialog, bitmap, etc ...), ho inserito anche un file .rc con cui è possibile effettuare un veloce copia / incolla della risorsa, più le eventuali bitmap e icone necessarie.

Naturalmente sono a disposizione per qualsiasi chiarimento che si rendesse necessario.

Dimenticavo che sono tutte funzioni e classi per sistemi Windows ...

Spero di aver fatto cosa gradita e, con l'occasione

Auguro un Buon Natale a tutti in questo spendido forum

Modificato: da drugo66
Link al commento
Condividi su altri siti


Allora,

trovate una raccolta di funzioni globali, quindi non si tratta di una classe: andiamo da un gestore per messaggi di errore di sistema, a funzioni per gestire ritardi, per rilevare un tempo trascorso, qualche funzione per aprire utilità di sistema e funzioni di conversioni varie; spesso non aggiungo nemmeno l file al mio progetto, ma mi limito a copiare la/le funzioni che mi servono al momento.

, invece, trovate una funzione per l'attesa del caricamento di driver e/o servizi all'avvio del sistema operativo; la necessità è nata quando ho utilizzato le schede I/O National e l'applicazione mi andava in errore solo all'avvio, perchè non aveva ancora caricato tutti i driver National.

Entrambe sono prive di una applicazione di prova.

Link al commento
Condividi su altri siti

Si continua,

sempre nella stessa sezione trovate una serie di controlli per le dialog, a colori e auto-dimensionabili:

(gestisce anche un gruppo di controlli)

L'esigenza è nata da poter cambiare colori e testo, ma anche altre proprietà più tipiche del controllo, in modo semplice ed immediato.

Dimenticavo che hanno tutte una applicazione di prova.

Modificato: da drugo66
Link al commento
Condividi su altri siti

Andiamo avanti:

è una classe per un controllo led, derivata da CStatic,

è una classe per utilizzare la classica MessageBox a colori, con i pulsanti multilingua e con la possibilità di modificare lo sfondo,

una per una finestra di avvio / presentazione per le nostre applicazioni,

una che utilizzo di solito per visualizzare i commenti durante l'esecuzione dei passi del ciclo di una stazione (che io chiamo storyboard)

che è una finestra di informazione abbinabile ad uno o più controlli,

una per un banner di allarme, comprensivo di storico; più avanti avrei l'intenzione di aggiungere le statistiche,

un di password e della sicurezza per una appicazione.

Anche tutti questi prototipi hanno l'applicazione di prova.

Vorrei segnalare anche che alcune di queste classi utilizzano anche il file di definizione Colors.h (quindi troverete il file all'interno delle applicazioni di prova), dove sono definiti tutti i colori che utilizzo di solito.

Per oggi mi fermo qui: ne ho ancora da postare, ma volevo prima finire di sistemare un po' i sorgenti.

Link al commento
Condividi su altri siti

Eccomi ancora qui; oggi ho aggiunto:

un gestore per stampe di testo comprensivo della gestione della stampante,

un gestore per porte seriali; l'applicazione di prova è uno sviluppo di DrugoTestSerialPort: ho aggiunto alcune funzioni nella classe ed alcune migliorie nell'applicazione,

un gestore di comunicazioni ethernet tramite i socket; è uno sviluppo della classe che avevo già postato,
una dialog con informazioni di sistema.
Sono tutte comprensive di applicazione di prova.
Alla prossima.
Link al commento
Condividi su altri siti

Segnalo un problema sulle classi CStatiCol e CGrBox: nella funzione PreSubclassWindow() occorre togliere le due righe riportate qui sotto:

// CStatiCol
// Presubclass window
void CStatiCol::PreSubclassWindow()
{
	if (NULL == CStatic::GetSafeHwnd())  // Eliminare
		return;			     // Eliminare

...

// CGrBox
// Pre subclass window
void CGrBox::PreSubclassWindow()
{
	if (NULL == CButton::GetSafeHwnd())	 // Eliminare
		return;				 // Eliminare

...

Poichè la funzione è eseguita dal sistema prima della creazione della finestra child del controllo, quelle due righe impediscono di eseguire il codice seguente, con la conseguenza che non sono salvati la posizione ed il font iniziale del controllo stesso; le corrispondenti funzioni (modifica del font e auto-dimensionamento) potrebbero dunque funzionare male.

Non mi ricordo il motivo dell'inserimento di quelle due righe (chissà a cosa diavolo stavo pensando ...), ma sistemando una classe derivata oggi me ne sono accorto e quindi ...

Colgo l'occassione per avvisare anche che non ho testato completamente tutte le funzionalità delle classi (soprattutto di quelle più vecchie), quindi in caso di errori, chiedo venia in anticipo :whistling:

Oggi vi propongo:

una un display digitale (c'è anche una classe per un orologio basata appunto sul display): è lo sviluppo di una classe scaricata dal web e nel file ci sono i ringraziamenti agli autori originali

una visualizzare data e ora di sistema (oppure un contatore) derivata da CStatiCol

Sono entrambe conprensive di applicazione di prova.

Alla prossima

Modificato: da drugo66
Link al commento
Condividi su altri siti

Ciao luciano,

avevo provato anch'io con le versioni più recenti di compilatori e c'era solo da togliere qualche avviso per eventuali routine di manipolazione stringhe ritenute obsolete.

Purtroppo Visual Basic l'ho utilizzato veramente poco, non ho mai fatto un progetto da zero e non ho più nemmeno l'ambiente: se hai voglia di fare un tentativo, e se sei in grado di importare le funzioni da una DLL esterna, posso provare a fare di una classe (fammi sapere quella che ti interessa di più) una DLL (scrivimi in privato, perchè è inutile postare qui qualcosa che poi magari non funziona) ed inviarti quella; una volta provata, possiamo anche postarla sul forum ed aggiungerla alla biblioteca. A meno che non sia possibile aggiungere codice VC++ direttamente nei form di VB, ma non ho mai sentito parlare ...

Fammi sapere.

Link al commento
Condividi su altri siti

  • 2 weeks later...

Eccomi di nuovo qui, però con cattive notizie: con Luciano abbiamo provato l'utilizzo di qualche DLL in Visual Basic, però senza riuscirci.

Tutte i controlli con risorse, o meglio le classi che devono esportare oggetti MFC (ad esempio la classe CLed), non possono essere esportati in DLL riutilizzabili da Visual Basic (almeno dalle informazioni che abbiamo reperito in rete), a meno di riscrivere l'intera classe come oggetto COM o ActiveX.

Appena ho un po' più tempo tenterò con le altre classi, le due di comunicazione, soprattutto perchè potrebbero servirmi ...

Link al commento
Condividi su altri siti

Ma non ci riesci neanche importandola come API nativa?

Facendo qualcosa del genere:

Imports System.Runtime.InteropServices

  <DllImport("CLed.dll", EntryPoint:="EntryPoint", bla bla bla....

chiamandola poi in modo statico con l'alias (adesso non mi ricordo bene la sintassi ma se cerchi in rete dovresti trovare il tutto).

Ciao

Link al commento
Condividi su altri siti

Ciao,

a quanto pare la libreria MFC è scritta solo per VC++, quindi, scrivendo una DLL, puoi usare le classi MFC all'interno di essa, ma se le esporti, un ambiente come Visual Basic non riuscirà a riconoscerla: infatti è possibile creare diversi tipi di DLL a seconda dell'utilizzo che si vuole; qui c'è tutta la spiegazione.

CLed è derivata da CStatic, che è appunto una classe MFC per un controllo di testo: per esportarla dovrei utilizzare una DLL di estensione (che è appunto quello che abbiamo provato con Luciano), ma poi lui non riesce a usarla con Visual Basic (restituisce un errore per il punto d'ingresso della DLL).

L'alternativa è riscrivere tutta la classe ...

Link al commento
Condividi su altri siti

  • 3 weeks later...

È strano, dovrebbe funzionare.

Mi ricordo di un tizio che programmava in VB e quando doveva fare cose complesse per VB usava delle DLL che gli faceva un amico in VC. Non ci metterei la mano sul fuoco ma mi sembra che questo amico usasse proprio la MFC per creare le DLL.

Forse faccio una domanda banale ma Luciano ha installato la MFC sul PC dove sviluppa in VB?... perché la MFC altro non sono che delle DLL a loro volta che devono essere presenti nel sistema. Il programma in VB caricherà la DLL di drugo ma la DLL di drugo a sua volta dovrà caricare le DLL che contengono la MFC.

L'alternativa sarebbe scrivere una DLL win32 invece che MFC, ma come scritto prima mi sembra strano che non funzioni.

Link al commento
Condividi su altri siti

Non so se Luciano abbia installato MFC o meno (credo di sì, perchè mi aveva detto di aver testato la classe con VS2010 in #8), ma dall'errore che restituisce (vedi in #12) direi che non riconosce proprio la DLL.

Il problema sempre essere quello in #12: se esporto una classe MFC, anche solo derivata, non mi permette di compilare una DLL standard, ma devo usare una DLL di estensione, la quale puo' essere riconosciuta solo da una applicazione VC++ con MFC.

Se vuoi provare tu sono disponibile ad inviarti una DLL di una delle classi a tua scelta: ho solo bisogno di una mail a cui inviarti il tutto (se sei interessato, mandami un MP), perchè vorrei evitare di postare sul forum qualcosa che non funziona. La DLL di estensione è semplice da compilare e, se riesci a risolvere il problema, magari puo' essere di interesse a qualcuno del forum.

Link al commento
Condividi su altri siti

Premetto che non uso Visual Studio, io preferisco i compilatori Borland (ora Embarcadero) ma sul PC di mia figlia c'è installato VS2013, posso fare una prova, è pur sempre un'esperienza. :smile:

Prova a compilare una DLL semplice, per vedere se funziona basta che ci sia una funzione banale, senza parametri, tipo una funzione test che chiamandola apre un MessageBox.

Ti invio la mia mail in privato.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...