2009-11-17 4 views
6

Vorrei sviluppare un controllo ActiveX e poiché non sono proprietario dello studio visivo mi chiedo se posso utilizzare Visual C++ Express Edition o se è necessario anche l'SDK di Windows Platform?Sviluppo di controlli ActiveX

+0

Non ho l'edizione VC++ espresso installato. Quali opzioni ti offre quando selezioni "File> Nuovo> Progetto ..."? – ChrisF

+0

Molto piccolo. Libreria di classi, CLR Console Application, CLR Progetto vuoto, Windows Form, applicazione console Win32, Win32 Progetto, Progetto vuoto. Penso di voler solo scrivere un'applicazione DLL. – Matt

risposta

11

Non è necessario che Visual Studio scriva un controllo Active X. Un controllo Active X è semplicemente un oggetto COM registrato in un modo specifico che implementa IUnknown e IObjectSafety.

Non è necessario creare un progetto Active X in Visual Studio. Puoi semplicemente creare una normale DLL, aggiungere il manifest appropriato e installarla usando gli strumenti CAB SDK.

Non è necessario utilizzare ATL per scrivere un controllo Active X. In effetti, è meglio non utilizzarlo finché non si capisce come funzionano le interfacce OLE nel modello di estensibilità IE.

Quindi sì, starai bene con Visual Studio Express.

EDIT:

Ecco un palese esempio, denominato YOURCONTROL.inf. Ovviamente sostituisci YOURCONTROL con quello che chiami ragazzo e genera il tuo GUID e i numeri di versione. Questo è il manifest minimo di cui avrai bisogno.

[version] 
signature="$CHICAGO$" 
AdvancedINF=2.0 

[Add.Code] 
YOURCONTROL.dll=YOURCONTROL.dll 

[YOURCONTROL.dll] 
file-win32-x86=thiscab 
clsid={11111111-2222-3333-4444-555555555555} 
FileVersion=1,2,3,4567 
RegisterServer=yes 

Avrete bisogno di un file DEF di serie nel progetto in cui sono elencate le funzioni esportate richieste per COM e di auto-registrazione. DllGetClassObject è dove la COM ti chiamerà per ottenere la classe factory per il tuo oggetto COM. RegisterServer e UnregisterServer sono dove si dovrebbe scrivere lo stato iniziale nel registro (ad esempio la registrazione dell'oggetto COM, ecc.).

EXPORTS 
    DllCanUnloadNow    PRIVATE 
    DllGetClassObject PRIVATE 
    DllRegisterServer PRIVATE 
    DllUnregisterServer PRIVATE 

avrete bisogno di un file IDL anche, in modo è possibile definire dispatch del vostro oggetto COM in modo che possa essere chiamato da script e quindi può generare eventi di Javascript.Qualcosa di simile a questo:

import "oaidl.idl"; 
import "ocidl.idl"; 

#include "dispids.h" // <-- define your DISPIDs here 

[ 
     uuid(<<generate your own guid here>>), 
     version(1.0), 
] 
library YOURCONTROLLIBRARY 
{ 
    [ 
     uuid(<<generate your own guid here>>), 
     hidden 
    ] 
    dispinterface DYOURCONTROLEvents 
    { 
     properties: 
     methods: 
     // Add outgoing events here. 
     [id(DISPID_SOME_EVENT)] void SomeEvent(); 
    } 

    [ 
     dual, 
     uuid(<<generate your own guid here>>) 
    ] 
    interface IYOURCONTROL : IDispatch 
    { 
     // Add methods and properties here. 
     [id(DISPID_SOMEMETHOD)] HRESULT SomeMethod([in] BSTR bstrFoo); 
    } 

    [ 
     uuid(<<generate your own guid here>>) 
    ] 
    coclass YOURCONTROLCtl 
    { 
     [default] interface IYOURCONTROL; 
     [source, default] dispinterface DYOURCONTROLEvents; 
    } 
} 

E, infine, il tuo punto di ingresso DLL dovrebbe essere simile a questa:

HINSTANCE g_hInstance; 
LONG g_nDllRefs; 

extern "C" 
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { 
    switch (dwReason) { 
     case DLL_PROCESS_ATTACH: 
      g_hInstance = hInstance; 
      g_nDllRefs = 0; 
      break; 

     case DLL_PROCESS_DETACH: 
      break; 
    } 

    return true; 
} 

// Call this whenever you create your object to keep your DLL loaded. 
void DllAddRef() { 
    InterlockedIncrement(&g_nDllRefs); 
} 

// Call this when your object is destroyed. 
void DllRelease() { 
    InterlockedDecrement(&g_nDllRefs); 
} 

STDAPI DllCanUnloadNow() { 
    return (g_nDllRefs == 0 ? S_OK : S_FALSE); 
} 

// This is where you create your class factory. See the IClassFactory documentation on msdn. 
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { 
    HRESULT hr; 
    if (rclsid == CLSID_YOUROBJECTCtl) { 
     CYOUROBJECTFactory *pYOUROBJECTFactory = new CYOUROBJECTFactory; 
     if (pYOUROBJECTFactory == NULL) { 
      hr = E_OUTOFMEMORY; 
     } else { 
      hr = pYOUROBJECTFactory ->QueryInterface(riid, ppv); 
     } 
    } else { 
     hr = CLASS_E_CLASSNOTAVAILABLE; 
    } 
    return hr; 
} 

STDAPI DllRegisterServer() { 
    // Write your registry keys for registering your ActiveX COM Object here. 
    return S_OK; 
} 

STDAPI DllUnregisterServer() { 
    // Delete your registry keys here. 
    return S_OK; 
} 
+0

Grazie mille. Potete fornirmi un link che descriva il processo e fornisca semplici esempi? – Matt

+0

Come è che, allora? –

+0

Grazie. È un inizio brillante. – Matt

0

Questo Microsoft Support post dal 2006 sarebbe indica che è possibile utilizzare l'edizione VC++ Express per lo sviluppo di controlli ActiveX:

si applicano a

Microsoft ActiveX Template Library 3.0, quando viene utilizzato con:
Microsoft Visual C++ 6.0 Enterprise Edition
Microsoft Visual C++ 6.0 Professional Edition
Microsoft Visual C++, 32-bit Learning Edition 6.0
Microsoft Visual C++ 2005 Express Edition
Microsoft Visual C++ .NET 2003 Standard Edition
Microsoft Visual C++ .NET 2002 Standard Edition

E 'stato un po' che ho sviluppato utilizzando ActiveX, ma non mi ricordo dover installare l'SDK della piattaforma Windows.

+2

Non penso che la pagina sia corretta. La pagina indica che l'esempio utilizza l'ATL e questa è una delle cose che mancano all'edizione di Visual C++ Express. – Matt