Newsgroup: it.comp.lang.visual-basic
Titolo: Oggetti COM, interfacce e UUID

Ciao a tutti,
sto realizzando un EXE ActiveX, che attraverso COM appunto dialoga con un
CAD (è il CAD ad usare il mio EXE ActiveX)...
che realizza il CAD (in c/c++) usa l'UUID per istanziare il mio oggetto.
Ora come posso essere certo che l'UUID non cambi? con la comp binaria
giusto?
e le interfaccie come si realizzano  (in breve)? cosa sono altre classi
publiche?
potreste indirizzarmi verso qualche risorsa web che in poche parole spiega
UUID, CLSID e via dicendo?
grazie a tutti,
Davide


Google is your friend (in ordine di semplicita' crescente, AFAICT)
http://www.roth.net/conference/perl/1999/ole.ppt
http://www.informatik.hu-berlin.de/~schult/download/DCOM%20Programming.ppt
http://www.empire.net/~dwasilew/AXCMLn-5.htm
http://www.cvc.uab.es/shared/teach/a20383/Curs01-2/teoria/dcom.pdf
http://www.vbug.co.uk/magazine/i2/version_compatibility_in_activex.asp
Ne stavo postando un altro ma l'autore sembra non aver capito una mazza
dell'OLE quindi tralascio.
Comunque con un po' di ricerca su google dovresti trovare un bel po' di
roba.
Ciaotutti,
*


sul piano pratico.. supponiamo di avere una dll com che esporta la classe
pubblica cClasse1
compilo con comp binaria ed ho 1 solo UUID
bene
ma se devo aggiungere un'altra classe pubblica cClasse2 questo equivale ad
aggoingere una nuova interfaccia? no varia il UUID giusto?
e se aggiungo un nuovo membro a cClasse1 ?
grazie
Davide


Non cambia l'uuid, ma puo' cambiare tra le compilazioni l'ordine dei metodi
che non sono presenti nella DLL di compatibilita', quindi vale lo
stessocaveat: una volta che consegni la nuova interfaccia pubblicata devi
attenerti a quella, sostituendo la vecchia dll con il compilato che hai dato
al programmatore C.
Segue un esempio di library MS,  generato aprendo con l'ole view la dll
msaddndr.dll; i commenti seguono lo stile IDL, quindi // commento
// Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: MSADDNDR.TLB
// la libreria e' msaddndr.dll AddInDesigner Object Library
// quella che segue e' la definizione della libreria:
[
  uuid(AC0714F2-3D04-11D1-AE7D-00A0C90F26F4),
  version(1.0),
  helpstring("Microsoft Add-In Designer")
]
// da qui cominciano le definizioni degli ogetti contenuti nella dll
library AddInDesignerObjects
{
    // tutti gli oggetti COM importano queste librerie, sono le basi del COM
stesso
    // la IDispatch, contenuta in essa,  e' la classe, che tu non vedi ma
che usi,
    // che permette di richiamare un metodo di un oggetto creato con
CreateObject.
    // TLib :     // TLib : OLE Automation :
{00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");
    // Forward declare all types defined in this typelib
    // questa libreria  pèubblica tre interfacce, che vengono dichiarate
come segue:
    interface IAddinDesigner;
    interface IAddinInstance;
    interface _IDTExtensibility2;
    // questo e' un enumerativo; in COM anche gli enum hanno una id
    // ricorda che se cambi un enumerativo si rompe la compatibilita'
binaria!
    typedef [uuid(289E9AF1-4973-11D1-AE81-00A0C90F26F4)]
    enum {
        ext_cm_AfterStartup = 0,
        ext_cm_Startup = 1,
        ext_cm_External = 2,
        ext_cm_CommandLine = 3
    } ext_ConnectMode;
    // come sopra
    typedef [uuid(289E9AF2-4973-11D1-AE81-00A0C90F26F4)]
    enum {
        ext_dm_HostShutdown = 0,
        ext_dm_UserClosed = 1
    } ext_DisconnectMode;
    // ora cominciano le interfacce
    // l'interdaccia che segue, IAddinDesigner, ha una uuid
    // AC0714F3-3D04-11D1-AE7D-00A0C90F26F4, che un programmatore
    // C puo' usare per invocare l'oggetto direttamente dal registry.
    // Eredita da IDispatch quindi puo' essere creata con CreateObject, come
    // tutte le interfacce scritte in VB - anche se questa DLL probabilmente
e' scritta in C
    [
      odl,
      uuid(AC0714F3-3D04-11D1-AE7D-00A0C90F26F4),
      helpstring("Add-In Designer Control"),
      hidden,
      dual,
      oleautomation
    ]
    interface IAddinDesigner : IDispatch {
    };
    // altra interfaccia, altra classe dal punto di vista di VB
    [
      odl,
      uuid(AC0714F4-3D04-11D1-AE7D-00A0C90F26F4),
      helpstring("Add-In Instance Object"),
      hidden,
      dual,
      oleautomation
    ]
    interface IAddinInstance : IDispatch {
    };
    // eccetera eccetera...
    [
      odl,
      uuid(B65AD801-ABAF-11D0-BB8B-00A0C90F2744),
      hidden,
      dual,
      oleautomation
    ]
    interface _IDTExtensibility2 : IDispatch {
        [id(0x00000001)]
        HRESULT OnConnection(
                        [in] IDispatch* Application,
                        [in] ext_ConnectMode ConnectMode,
                        [in] IDispatch* AddInInst,
                        [in] SAFEARRAY(VARIANT)* custom);
        [id(0x00000002)]
        HRESULT OnDisconnection(
                        [in] ext_DisconnectMode RemoveMode,
                        [in] SAFEARRAY(VARIANT)* custom);
        [id(0x00000003)]
        HRESULT OnAddInsUpdate([in] SAFEARRAY(VARIANT)* custom);
        [id(0x00000004)]
        HRESULT OnStartupComplete([in] SAFEARRAY(VARIANT)* custom);
        [id(0x00000005)]
        HRESULT OnBeginShutdown([in] SAFEARRAY(VARIANT)* custom);
    };
    typedef [public]
    _IDTExtensibility2 IDTExtensibility2;
    [
      uuid(AC0714F6-3D04-11D1-AE7D-00A0C90F26F4),
      helpstring("Add-In Designer control")
    ]
    coclass AddinDesigner {
        [default] interface IAddinDesigner;
        [default, source] interface _IDTExtensibility2;
    };
    [
      uuid(AC0714F7-3D04-11D1-AE7D-00A0C90F26F4),
      helpstring("Add-In Instance Object")
    ]
    coclass AddinInstance {
        [default] interface IAddinInstance;
        [default, source] interface _IDTExtensibility2;
    };
};
Consiglio finale: secondo me sarebbe meglio che il programmatore C usasse la
IDispatch che ewsponi e chiamasse l'oggetto con le equivalenti della
CreateObject, cosi' dovresti solo accertarti di mantenere i nomi corretti.
E' meno prestazionale, certo... Ma se vuoi le prestazioni non richiami dei
metodi COM da una DLL scritta in VB.
Ciaotutti,
*

 metodi COM da una DLL scritta in VB.
ma figurati! in pratica tuttto questo ambaradan serve a dire al mio
applicativo (CAM) il path del file esportato dal loro CAD!!! che prestazioni
ci dovreanno essere qui :)
ma quello programma in C.. è un dottorone :D
Davide


Ma un parametro da linea di comando no?
Ciaotutti,
*