PDA

Visualizza la versione completa : C++ e COM


Yale
17-09-2004, 14:58
Fo il seguente problema: ho fatto un programmino in C+ che contina nel tempo a produrmi una matrice di numeri casuali. Vorrei sparare questi dati in un foglio excel, in modo tale che anche sul foglio excel questi dati continuano ad aggiornarsi alimentati dal programmino in c++. A fare tutto ciò, riesco, utilizzando la COM.
In particolare utilizzando CoCreateInstance ed Invoke.
Ma mentre il programma è in funzione, se vado ad intervenire sul foglio di excel per esempio inserendo una somma, il programma si blocca con errore. Che posso fare::: devo per caso utilizzare qualche funzione apposita di COM per sparare i dati in modo asincronico???
Ditemi voi.
ciao e Grazie

unomichisiada
17-09-2004, 15:15
Onestamente sono completamente riguardo alle interfacce COM etc..però da quelo che ahai scritto il tuo problema sembrerebbe un problema di mancata sincronizzazione tra processi nell'accesso allo stesso documento quindi potresti provare ad inserire in una sezione critica il codice che accede al documento.Non so prova e fammi sapere.
Nel caso non lo sapessi una sezione critica è un'area di codice che può essere eseguita da un solo processo per volta.MFC offre la classe CCriticalSection per usarle.

unomichisiada
17-09-2004, 15:16
...completamente digiuno ....

Yale
17-09-2004, 15:42
grazzie dell'idea---adesso provo, poi ti so dire, ci metterò un pò perchè è la prima volta che sento parlare delle sezioni critiche per cui devo prima informarmi un pò.

Yale
20-09-2004, 10:14
Sono veramente in panne, non so proprio come gestire una zona critica: vi riespongo il mio problema in modo più dettagliato vediamo se qualcuno sa darmi una soluzione:


1. Ho sviluppato un programmino in C++ che si compone di una main e 21 functions. Una di queste function richiamata dalla main provvede a prelevare dati da internet e rielaborarli in continuo inserendo i risultati in una matrice C++.
2. A questo punto il problema è quello di visualizzare il risultato, è ho scelto come interfaccia di visualizzazione excel.
3. Il programmino C++ preleva i dati da un socket appena si accorge che il socket è pieno, a questo punto rielabora i dati è spara la matrice risultato in un foglio di excel.
4. Per fare cio sfrutto COM. In sostanza nella Main Utilizzo "CoInitialize" e "CoCreateInstance" , mentre nella function che preleva i dati in continuo e li rielabora (essa è un ciclo continuo "while" che continua sino a che non lo interrompo con ctr C) alla fine del ciclo utilizzo "GetIDsOfNames" ed "Invoke" per richiamare l'oggetto excel e i vari gradi fino al foglio di excel dove poi sparo i dati.
5. la procedura funziona nel senso che il foglio di excel continua ad aggiornarsi in continuo, ma il PROBLEMONE è che quando intervengo manualmente sul foglio di excel per esempio scrivendo su una cella , il programma si interrompe con errore, in sostanza dice: IDispatch:GetIDsOfNames("&S")Failed w/err 0x00112e7d0.
Che fare, mi è stato proposto di risolvere il problema con le sezioni critiche, ma non so proprio da dove inizziare.

HELP HELP HELP HELP:( :( :(

unomichisiada
20-09-2004, 12:35
Puoi provare a postare un pò di codice compilabile.Non ti sto chiedendo di postare l'intero codice del tuo prog(cosa che magari non ti va di fare) ma solo di prendere il tuo prog,sfoltirlo di tutto tranne la parte che fa il salvataggio via COM (magari salvando dati fasulli come una stringa ,che è sempre la stessa, in continuazione) postare un programma minimale che ha lo stesso problema e che anche se non fa nulla di concreto si compila e si esegue correttamente.sarebbe più facile aiutarti o almeno provarci.Ciao

Yale
20-09-2004, 13:10
hai ragione, ma in questi minuti sono riuscito a risolvere il problema. Ho ancora da capire bene le dinamiche del discorso, comunque
ho fatto come segue:
ho utilizzato tutti gli script relativi a COM nella main, sino ad arrivare ad ottenere il DISPID del range di celle su cui volevo sparare i dati in real time.
A questo punto ho inserito tale dispid in una variabile dichiarata a livello HEAD.
Quindi, nella function che contiene il loop che continua a richiedere i dati dal web e li rielabora, ho inserito solo "invoke", utilizzando come argomento la variabile dispid dichiarata in HEAD....e funziona.
Riesco interagire nel foglio di excel senza alcun intoppo.

In sostanza non ho fatto altro che spostare GetIDsOF Names dalla function al main.

ciao e grazie a tutti

unomichisiada
20-09-2004, 14:08
Ok se hai risolto allora...Ciao ciao

Loading