2009-11-17 5 views
6

Je voudrais développer un contrôle ActiveX et comme je ne possède pas de studio visuel, je me demande si je peux utiliser l'édition expresse de VisualC++ ou ai-je besoin du SDK Windows Platform?Développement de contrôles ActiveX

+0

Je n'ai pas l'édition VC++ Express est installé. Quelles options vous donne-t-il lorsque vous sélectionnez "Fichier> Nouveau> Projet ..."? – ChrisF

+0

Très peu. Bibliothèque de classes, application console CLR, projet vide CLR, application Windows Forms, application console Win32, projet Win32, projet vide. Je pense que je veux juste écrire une application DLL. – Matt

Répondre

11

Vous n'avez pas besoin de Visual Studio pour écrire un contrôle Active X. Un contrôle Active X est simplement un objet COM enregistré d'une manière spécifique qui implémente IUnknown et IObjectSafety.

Vous n'avez pas besoin de créer un projet Visual Studio Active X. Vous pouvez simplement créer une DLL normale, ajouter le manifeste approprié et l'utiliser en utilisant les outils CAB SDK.

Vous n'avez pas besoin d'utiliser ATL pour écrire un contrôle Active X. En fait, il est probablement préférable de ne pas l'utiliser tant que vous n'avez pas compris le fonctionnement des interfaces OLE dans le modèle d'extensibilité IE.

Alors oui, vous serez très bien avec Visual Studio Express.

EDIT:

  • Vous devriez commencer par Introduction to Active X Controls. Voici le CAB SDK.
  • Vous devriez avoir aucun problème à trouver des exemples pour les contrôles ActiveX de base en effectuant une recherche google, etc.

est ici un manifeste de l'échantillon, appelé YOURCONTROL.inf. Bien évidemment, remplacez YOURCONTROL par ce que vous appelez votre type, et générez vos propres GUID et numéros de version. C'est le manifeste minimum dont vous aurez besoin.

[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 

Vous aurez besoin d'un fichier standard .def dans votre projet qui énumère les fonctions exportées nécessaires pour COM et auto-inscription. DllGetClassObject est où COM vous appellera pour obtenir la fabrique de classe pour votre objet COM. RegisterServer et UnregisterServer est où vous devez écrire votre état initial dans le registre (par exemple votre enregistrement d'objet COM, etc).

EXPORTS 
    DllCanUnloadNow    PRIVATE 
    DllGetClassObject PRIVATE 
    DllRegisterServer PRIVATE 
    DllUnregisterServer PRIVATE 

Vous aurez besoin d'un fichier IDL aussi, de sorte que vous pouvez définir votre dispinterface de l'objet COM de sorte qu'il peut être appelé à partir du script, et il peut déclencher des événements à Javascript.Quelque chose comme ceci:

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; 
    } 
} 

Et, enfin, votre point d'entrée de DLL devrait ressembler à ceci:

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

Merci beaucoup. Pouvez-vous me fournir un lien qui décrit le processus et donne des exemples simples? – Matt

+0

Comment ça alors? –

+0

Merci. C'est un début brillant. – Matt

0

Cette Microsoft Support post de 2006 serait indique que vous pouvez utiliser l'édition VC++ Express pour le développement de contrôles ActiveX:

APPLIQUE À

Microsoft ActiveX Template Library 3.0, lorsqu'il est utilisé avec:
Microsoft Visual C++ 6.0 Édition Entreprise
Microsoft Visual C++ 6.0 Édition professionnelle
Microsoft Visual C++, 32 bits Édition apprentissage 6.0
Microsoft Visual C++ 2005 Express Edition
Microsoft Visual C++ .NET 2003 Standard Edition
Microsoft Visual C++ .NET 2002 Standard Edition

Il a été un moment que j'ai développé en utilisant ActiveX, mais je ne me souviens pas avoir à installer le Kit de développement Windows Platform SDK.

+2

Je ne pense pas que la page est correcte. La page indique que l'exemple utilise l'ATL et c'est l'un des éléments manquants de l'édition Visual C++ Express. – Matt

Questions connexes