2009-11-17 13 views
6

Chciałbym opracować formant ActiveX i nie posiadam Visual Studio Zastanawiam się, czy mogę używać edycji ekspresowej VisualC++ na własną rękę, czy też potrzebuję SDK platformy Windows?Tworzenie formantów ActiveX

+0

nie mam zainstalowany edycja VC++ Express. Jakie opcje daje ci wybór "Plik> Nowy> Projekt ..."? – ChrisF

+0

Bardzo mało. Biblioteka klas, aplikacja konsoli CLR, pusty projekt CLR, aplikacja Windows Forms, aplikacja Win32 Console, projekt Win32, pusty projekt. Myślę, że chcę po prostu napisać aplikację DLL. – Matt

Odpowiedz

11

Do napisania formantu Active X nie jest potrzebne narzędzie Visual Studio. Formant Active X to po prostu obiekt COM, który jest zarejestrowany w określony sposób, który implementuje IUnknown i IObjectSafety.

Nie trzeba tworzyć projektu Visual Studio Active X. Możesz po prostu utworzyć zwykłą bibliotekę DLL, dodać odpowiedni manifest i przenieść go za pomocą narzędzi CAB SDK.

Nie musisz używać ATL, aby napisać kontrolkę Active X. W rzeczywistości prawdopodobnie lepiej nie używać go, dopóki nie zrozumiesz, jak działają interfejsy OLE w modelu rozszerzalności IE.

Tak, wszystko będzie dobrze z Visual Studio Express.

EDIT:

Oto manifest próbki, zwany YOURCONTROL.inf. Oczywiście wymień YOURCONTROL na cokolwiek zwą facetem i wygeneruj własny GUID i numery wersji. To jest minimalny manifest, którego będziesz potrzebować.

[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 

Musisz standardowego pliku .def w projekcie z listą wymaganych funkcji eksportowanych do COM i samodzielnej rejestracji. DllGetClassObject jest miejscem, w którym COM wywoła cię, aby uzyskać fabrykę klas dla obiektu COM. RegisterServer i UnregisterServer to miejsce, w którym powinieneś zapisać swój początkowy stan w rejestrze (np. Rejestrację obiektu COM itp.).

EXPORTS 
    DllCanUnloadNow    PRIVATE 
    DllGetClassObject PRIVATE 
    DllRegisterServer PRIVATE 
    DllUnregisterServer PRIVATE 

Musisz plik IDL też, więc można zdefiniować dispinterface Twojego obiektu COM, tak to można nazwać od scenariusza, a więc można go odpalić zdarzenia JavaScript.Coś takiego:

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

I wreszcie, twój punkt wejścia DLL powinna wyglądać mniej więcej tak:

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

Wielkie dzięki. Czy możesz podać link, który opisuje proces i podaje proste przykłady? – Matt

+0

Co to jest? –

+0

Dziękuję. To świetny początek. – Matt

0

Ten Microsoft Support post od 2006 by wskazuje, że można użyć wydanie VC++ Express, za opracowanie formantów ActiveX:

DOTYCZY

Microsoft Active Template Library 3.0 na następujących platformach:
Microsoft Visual C++ 6.0 Enterprise Edition
Microsoft Visual C++ 6.0 Professional Edition
Microsoft Visual C++, 32-bitowa edycja edukacyjna 6.0
Microsoft Visual C++ 2005 Express Edition
Microsoft Visual C++ .NET 2003 Standard Edition
Microsoft Visual C++ .NET 2002 Standard Edition

Minęło trochę czasu odkąd opracowana z wykorzystaniem ActiveX, ale nie pamiętam konieczność zainstalowania zestawu SDK platformy Windows.

+2

Nie sądzę, że strona jest poprawna. Strona wskazuje, że próbka używa ATL i jest to jedna z rzeczy, których brakuje w edycji Visual C++ Express. – Matt

Powiązane problemy