Newsgroup: it.comp.lang.c++
Titolo: Creazione OLE Server e OLE Client con VC++5

Salve a tutti,
sono un neofita del C++ e del Visual C++5.
Mi trovo a dover creare un OLE Server e un OLE Client con il suddetto tool
di sviluppo ma non nego di trovare difficoltà.
Il mio OLE Server deve avere le sembianze di una DLL e le funzionalità di
quest'ultimo devono poter essere richiamate da un Frame Dialog ad esempio
cliccando su un bottone.
Io ho approcciato al problema generando, attraverso l'AppWizard, un ActiveX
e implementando le interfacce. La domanda a questo punto è:
COME FACCIO DALLA MIA GUI A RICHIAMARE LE INTERFACCIE DELL'ACTIVEX?
Grazie a tutti
    Matteo
P.S.
Sicuramente l'approccio che ho avuto nell'implementare è sbagliato ma
tentare non nuoce.

tentare non nuoce.
Mah, non e` detto sia sbagliato, ma non avendo tu chiarito
bene cosa devi fare e perche` e` difficile valutare...!
Alex

Ciao Alex,
ti ringrazio per la risposta e proverò ad essere più chiaro.
Immagina che io bebba avere una interfaccia utente da cui ho la possibilità
di richiamare, attraverso bottoni o altri oggetti simili, le funzionalità
offertemi dalla OLE Server che devo implementare.
Io devo poter avere due possibilità o richiamare direttamente una DLL per
una applicazione stand-alon (e la cosa è fatta) oppure, dopo aver
"incapsulato" le funzionalità della mia DLL all'interno di un OLE Server,
poter distribuire l'applicazione e far dialogare le parti tramite DCOM
protocol.
Per effettuare le mie prove ho creato un ActiveX, visto che sarà necessario
sfruttare Internet, che conteneva al suo interno le funzionalità della mia
DLL e la cosa funzionava perfettamente testando il tutto nell' ActiveX Test
Container.
I problemi sono sorti nel momento in cui ho provato ha richiamare le
funzionalità di questo ActiveX dalla mia GUI creata utilizzando l'AppWizard
e scegliendo come superclasse per la miainterfaccia utente un CDialog.
Spero di essere stato più chiaro e che sulla base di questo tu possa essermi
ancora di aiuto.
Ti ringrazio in anticipo
    Ciao
        Matteo

ancora di aiuto.
Bisogna vedere che problemi stai avendo.  In generale, per connettere
un componente ActiveX in tutta la sua ricchezza a un dialogo MFC la
strada canonica passa da Project/Add to Project/Components and
Controls/Registered ActiveX Controls (lo hai registrato il tuo control
ActiveX, vero?)/click sul controllo/Insert/OK/appare il dialogo Confirm
Classes e dai nuovamente OK/Close.  Adesso, quando in questo
progetto vai a editare un dialogo nel ResourceView, nella palette dei
Controls ti trovi anche l'ActiveX teste` inserito, pronto per essere
messo nel tuo dialogo col solito Drag'n'Drop, resizato, piazzato con
le sue belle proprieta` ecc ecc.  Inoltre nella ClassView ti trovi una
nuova classe preparata dal wizard che incapsula ed espone la
interfaccia di default del tuo control, piena zeppa di proprieta` e
metodi.  Nel ClassWizard per il tuo dialogo puoi gestire gli eventi
generati da questo controllo, naturalmente, oltre o invece che
colloquiare con la classe dopo averla agganciata da Member
Variables/Add Variable sempre del Class Wizard.
Tutto questo, secondo me, non e` il modo piu` semplice di gestire
un piccolo "colloquio" con un server COM "come se" fosse una
DLL.  A questo scopo, invece, io in Visual C++ userei il cosiddetto
"native COM support" del compilatore.
Tutto inizia con l'istruzione:
    #import "mycontrol.ocx" nonamespace
(al #import puoi dare come argomento una qualsiasi type library
[normalmente un file di tipo tlb] o exe/dll/ocx/olb/ecc che abbia una
typelib come risorsa; puoi inoltre dare molti parametri per avere
esatto controllo sul suo comportamento, "nonamespace" e` solo
una scelta di comodo, guarda nell'help in linea di VC++ 5 per tutta
la pappardella...!).
Adesso, in questo file sorgente .cpp, puoi fare degli smart
pointer a interfacce COM descritte nella type library, connetterli
a istanze, chiamarci metodi, leggere/scrivere proprieta`, ecc.
Supponiamo ad esempio che nel tuo file IDL il tuo controllo,
in parte, sia descritto cosi`:
    // snippiamo gli attributi vari
    interface IMyFunction {
        HRESULT MyFunction([in] double arg,
            [out, retval] double *result);
    }
e che il suo ProgId iscritto nella registry sia ad esempio:
    MyControl.MyControl.1
Allora, dopo avere #import'ato la typelib risultante, tu
puoi scrivere per esempio:
    IMyFunctionPtr p("MyControl.Mycontrol.1");
    double myResult = p->MyFunction(12.345);
Qualsiasi errore o problema causera` una exception
C++ (che puoi gestire con un try/catch, ovviamente).
L'oggetto vera` automaticamente Release-ato quando
lo smart pointer decede (ad esempio a fine blocco,
se e` una variabile automatica [cioe` vive in stack]).
Ah, attenzione solo a un dettaglio, devi avere fatto
partire il COM... basta un CoInitialize(0) da qualche
parte, tipicamente in InitInstance in una applicazione
MFC, e CoUninitialize() prima di uscire dal programma.
Spero che queste indicazioni possano bastare...?  Se
tutto questo non ti funziona, sara` meglio che tu entri
piu` in dettaglio su cosa stai facendo e che problemi hai!
Alex

Grazie per le informazioni, sono riuscito a fare "comunicare" la mia
interfaccia grafica con l'ActiveX da me creato. L'unico problema rimasto
irrisolto è come permettere la comunicazione remota.
Adesso l'obiettivo è quello di posizionare l'ActiveX su una macchinaB e fare
in modo che dalla macchinaA(client) io possa richiamare le funzionalità
richieste presenti nel mio ActiveX.
Mi sto' attrezzando per capire come funziona, grazie soprattutto alle vostre
indicazioni, ma qualsiasi ulteriore suggerimento sara' sembre bene accetto.
Grazie in anticipo
    Matteo

irrisolto è come permettere la comunicazione remota.
Visto che usi COM, se il tuo server gira Windows NT 4.0 o meglio, o
Windows 98 o W/95 con opportuni add-on per DCOM downloadabili
dalla Microsoft, il "problema"... non dovrebbe essere tale (al netto,
s'intende, delle *prestazioni*: se "remotamente" devi scambiare molti
dati molto in fretta, allora occorre certo un progetto "mirato").  In
particolare, non dovrai cambiare neppure una riga di codice ne`
ricompilare alcunche` -- solo istallare correttamente nella registry
della macchina "remota" le informazioni che le serviranno allo
scopo di reperire il tuo servente.  DCOMCNFG.EXE (con una mano
da OLEVIEW.EXE e magari da REGEDT32 o REGEDIT che sia),
dovrebbe permetterti di sistemare il tutto senza troppa fatica.
Alex