Newsgroup: it.comp.lang.visual-basic
Titolo: IDL, Type Library e Visual Basic

Salve, ho trovato nel Platform SDK July 2002 il file netcon.idl,  e l'ho
modificato affinchè esportasse anche l'interfaccia INetConnectionMenager
della dll netshare.dll, così ho aggiunto in coda al file le seguenti righe:
    [
        uuid(5C63C1AD-3956-4FF8-8486-AAAAAAAAAAAA),
        helpstring("NetConnectionManager Class")
    ]
    coclass NetConnectionManager
    {
        [default] interface INetConnectionManager;
    };
Ho fatto un copia e incolla di una coclasse già esportata e ho messo un uid
a caso, visto che non sapevo dove andarlo a cercare (quello che finisce con
AA...), ho compilato l'idl e adesso ho la type library.
Però quando vado ad eseguire le seguenti righe:
Dim a As New NETCONLib.NetConnectionManager
Dim pp As NETCONLib.IEnumNetConnection
a.EnumConnections NCME_DEFAULT, pp
mi ritorna il seguente errore:
Run-time error '429':
ActiveX component can't create object
Che posso fare?
La dll è ovviamente registrata e aprendola con il notepad ho verificato la
presenza dell'interfaccia INetConnectionManager quindi dovrei poterla usare.
Forse la variabile pp non va passata in quel modo ? la dichiarazione del
metodo EnumConnections nel file IDL è la seguente:
    HRESULT EnumConnections(
        [in] NETCONMGR_ENUM_FLAGS   Flags,
        [out] IEnumNetConnection**  ppEnum);
e ho qualche dubbio su quel doppio puntatore.
Ho provato con varptr, con l'api RtlMoveMemory, ma non ha funzionato.
Grazie per il vostro aiuto.

Precisazione la dll si chiama netshell.dll no netshare.dll

Che posso fare?
Potresti dirci come e' stata definita l'interfaccia.
Poi andiamo avanti.
-- 
ciao, hal

 Poi andiamo avanti.
Spero intendi questo :
//+-------------------------------------------------------------------------
--
// INetConnectionManager - The top-level object that contains all of the
//      INetConnection objects on a machine.
//
// This interface manages INetConnection objects.  It provides methods
// to:
//     - Enumerate INetConnections
//     - Remove an INetConnection
//     - Find an INetConnection
//
// Note: Adding a connection is not yet performed programatically through
// the connection manager.  Instead, the shell owns creating connection
// objects through a UI interface.
//
[
    object,
    uuid(C08956A2-1CD3-11D1-B1C5-00805FC1270E),
    pointer_default(unique)
]
interface INetConnectionManager : IUnknown
{
    typedef enum tagNETCONMGR_ENUM_FLAGS
    {
        NCME_DEFAULT = 0x0,
    } NETCONMGR_ENUM_FLAGS;
    // Return an IEnumNetConnection interface used to enumerate all of
    // the contained connection objects.
    //

};

Era necessario impostare il corretto uid, ma non quello restituito dal
guidgen.exe bensì questo : ba126ad1-2166-11d1-b1d0-00805fc1270e. Non
chiedermi perchè, io non lo so, mi è stato detto di mettere questo uid ed in
effetti  ha funzionato.
Adesso riesco a disabilitare o abilitare una connessione da visual basic, è
rimasto un solo piccolissimo problema, non riesco a leggere le proprietà di
una connesione inquanto il compilatore di visual basic mi dice che
potrebbero esistere delle restrizioni sull'utilizzo del metodo o uno dei
tipi di dato utilizzato non è supportato da visual basic. In effetti per far
funzionare il tutto ho dovuto modificare in più parti il file IDL
sostituendo i tipi di dato da lui proposti con qualcosa che poteva essere
compatibile con visual basic, per esempio ho sostituito il tipo ULONG con
LONG, DWORD e WORD sempre con LONG, e fino a qui tutto ha funzionato alla
perfezione ma con il seguente metodo ci sono problemi:
struttura del parametro del metodo :
    typedef enum tagNETCON_STATUS   // questa è OK con visual basic
    {
        NCS_DISCONNECTED,
        NCS_CONNECTING,
        NCS_CONNECTED,
        NCS_DISCONNECTING,
        NCS_HARDWARE_NOT_PRESENT,
        NCS_HARDWARE_DISABLED,
        NCS_HARDWARE_MALFUNCTION,
        NCS_MEDIA_DISCONNECTED,
        NCS_AUTHENTICATING,
        NCS_AUTHENTICATION_SUCCEEDED,
        NCS_AUTHENTICATION_FAILED,
        NCS_INVALID_ADDRESS,
        NCS_CREDENTIALS_REQUIRED
    } NETCON_STATUS;
    typedef enum tagNETCON_MEDIATYPE // questa è OK con visual basic
    {
        NCM_NONE,
        NCM_DIRECT,
        NCM_ISDN,
        NCM_LAN,
        NCM_PHONE,
        NCM_TUNNEL,
        NCM_PPPOE,
        NCM_BRIDGE,
        NCM_SHAREDACCESSHOST_LAN,
        NCM_SHAREDACCESSHOST_RAS,
    } NETCON_MEDIATYPE;
 typedef struct tagGUID {          // questa l'ho aggiunta io
  LONG Data1;
  LONG   Data2;
  LONG   Data3;
  BYTE  Data4[8];
 } GUID;
    typedef struct tagNETCON_PROPERTIES // questa l'ho modificata e adesso è
compatibile con visual basic
    {
                 GUID               guidId;
        [string] BSTR             pszwName; // [string] LPWSTR pszwName;
        [string] BSTR             pszwDeviceName; // [string] LPWSTR
pszwDeviceName;
                 NETCON_STATUS      Status;
                 NETCON_MEDIATYPE   MediaType;
                 LONG               dwCharacter;// DWORD dwCharacter;
                 GUID              clsidThisObject; // CLSID
clsidThisObject;
                 GUID              clsidUiObject; // CLSID
clsidUiObject;
    } NETCON_PROPERTIES;
il metodo è definito come segue:
    HRESULT GetProperties(
        [out] NETCON_PROPERTIES** ppProps);
Come posso risolvere il problema? potete esseremi di aiuto?
Grazie per il vostro interessamento e perdonate il mio continuo assillo.
Alla fine, quando funzionerà, se volete vi posto tutto il codice.