Newsgroup: it.comp.programmare.win32
Titolo: #import per oggetto com

salve,
Devo allora devo importare un oggetto com che devo utilizzare nel mio
progetto.
il problema e che faccio l'import così:
#import "path/nomefile.exe"
compila e non succede niente ... non dovrebbe creari dei file ?
ciao.

 30 Settembre 2004: Workshop su 
asp.net
 <
Microsoft .NET MVP 
http://mvp.support.microsoft.com
 -
http://italy.mvps.org
 UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org
 Weblog: 
http://blogs.ugidotnet.org/raffaele


No non la contiene e comunque quei file gli ha creati solo che non capisco
perchè le interfaccie non funzionano
o meglio quando provo ad usarle mi dice che non è registrata...
che posso fare ?

 o meglio quando provo ad usarle mi dice che non è registrata...
Sei piuttosto vago ...
se ha creato il .tli / .tlh significa che contiene la type library.
Quei file contengono le dichiarazioni, gli smart pointer, etc che ti
consentono di creare e usare l'oggetto.
Quando dice interfaccia non registrata, che operazione stai facendo? Creando
l'oggetto? E soprattutto quale'è l'interfaccia?
Altra cosa da controllare subito è: hai registrato l'oggetto com?
Se l'oggetto com è quell'exe di solito si registra da riga di comando con:
c:\> nomefile.exe /regserver
L'hai fatto? O il programma era già stato registrato precedentemente?



hai ragione pasto il codice :
#import "C:\Programmi\Bentley\Program\MicroStation\ustation.exe"
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//
HRESULT hresult=0;
//
MicroStationDGN::_ApplicationPtr microStationApp;
hresult=microStationApp.CreateInstance(__uuidof(MicroStationDGN::Application
));
ASSERT(hresult==S_OK);
microStationApp->Caption="PruebaMvba_command";
//
MicroStationDGN::_ElementPtr element;
hresult=element.CreateInstance(__uuidof(MicroStationDGN::Element));
ASSERT(hresult==S_OK);
con vs 6 da errore al primo create col 7 al secondo mi dice "interfaccia non
registrata"

 "interfaccia non registrata"
Questo ha tutta l'aria che l'oggetto che vuoi creare non sia stato
registrato con regsvr32 (se dll) o con /regserver (se exe).
Sicuro che quell'applicativo sia installato correttamente?
Cosa dice il manuale di quell'applicativo (non hai un esempio di base)?



regserver l'ho fatto non mi da nessun output ma neanche errore
l'errore che da è
Eccezione non gestita a 0x77ab2994 in test_import.exe: 0xC0000005:
Violazione di accesso nella lettura del percorso 0xfeeefeee.
in questa parte di codice :
// If we still have an interface then Release() it. The interface
// may be NULL if Detach() has previously been called, or if it was
// never set.
//
~_com_ptr_t() throw()
{
_Release();
}
questo è il codice :
::CoInitialize(NULL);
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hresult=0;
MicroStationDGN::_ApplicationPtr microStationApp;
hresult=microStationApp.CreateInstance("MicrostationDGN.Application");
ASSERT(hresult==S_OK);
microStationApp->Caption = "ciao";
//funziona
MicroStationDGN::_ElementPtr element;
hresult=element.CreateInstance(__uuidof(MicroStationDGN::Element));
ASSERT(hresult==S_OK);
//L'errore lo da qui
::CoUninitialize();
Nella documentazione parla poco di di c++ o cmq come gestire i com ... in
questo modo tratta più vba (per quanto ne so io)
... se ti servono altre informazioni sono qua ...

>> CoUninitialize();
Chiaro, qui c'è un grosso errore.
Tu stai usando gli smart pointer che ti risparmiano di chiamare manualmente
le Release degli oggetti com. Lo smart pointer rilascia l'interfaccia quando
viene chiamato il distruttore.
Tu però chiudi l'aprtment COM (CoUninitialize) prima che venga chiamato il
distruttore.
La CoUninitialize va chiamata dopo il distruttore.
La soluzione è semplice. Dichiarare questa struttura nello scope globale:
struct Init
{
    Init(){::CoInitialize(NULL);}
    ~Init(){::CoUninitialize();}
} _Init;
Ovviamente devi togliere dal listato le chiamate a CoInitialize /
CoUninitialize.
Così facendo, il costruttore/distruttore di questa classe pubblica verrà
chiamato prima/dopo ogni altro costruttore/distruttore contenuto nelle
funzioni del tuo programma.
Comincia con questo e vediamo se c'è dell'altro ...


 ha scritto nel messaggio
news:4qH4d.17694$Ie2....@tornado.fastwebnet.it...


1.si
 da quell'errore se vedo il valore di hresult ma quando incontra
l'assert genera quell'eccezzione.
2.il
 problema l'ho risolto alla fine dei conti ero io che usavo male la
classe (anche se ho dei dubbi)
il ragionamento che hai fatto tu a mio avviso è corretto, ma "purtroppo" non
era quello che generava l'errore
sinceramente se hai voglia (anche se ho risolto)  mi interessa cercare di
capire perchè da quel messaggio.
Mi sono documentato e pare che quella classe sia astratta! tieni conto che
come dire
questo modello a oggetti di com è preso da vba ( espresso male ma credo
abbia reso l'idea )
in pratica c'è un sofware, che usa vba per personalizzarlo (un pò come
excel)
e io sto cercando di usare gli stessi oggetti com o coClassi che  questo
componente mette  a disposizione.
...