Udostępnij przez


Kontrolki ActiveX MFC: licencjonowanie kontrolki ActiveX

Obsługa licencjonowania, opcjonalna funkcja kontrolek ActiveX, umożliwia kontrolowanie, kto może używać lub rozpowszechniać kontrolkę. (Aby uzyskać dodatkową dyskusję na temat problemów z licencjonowaniem, zobacz Problemy z licencjonowaniem w temacie Uaktualnianie istniejącej kontrolki ActiveX).

Ważne

ActiveX to starsza technologia, która nie powinna być używana do tworzenia nowych rozwiązań. Aby uzyskać więcej informacji na temat nowoczesnych technologii zastępujących activex, zobacz Kontrolki ActiveX.

W tym artykule omówiono następujące zagadnienia:

Kontrolki ActiveX, które implementują licencjonowanie, umożliwiają deweloperowi kontroli określenie, w jaki sposób inne osoby będą używać kontrolki ActiveX. Nabywca otrzymuje kontrolkę i plik .LIC zgodnie z umową, że może rozpowszechniać kontrolkę, ale nie plik .LIC, wraz z aplikacją, która korzysta z kontrolki. Uniemożliwia to użytkownikom tej aplikacji pisanie nowych aplikacji korzystających z kontrolki bez uprzedniego uzyskania licencji na kontrolkę.

Omówienie licencjonowania kontrolek ActiveX

Aby zapewnić obsługę licencjonowania kontrolek ActiveX, klasa COleObjectFactory udostępnia implementację dla kilku funkcji w interfejsie IClassFactory2 : IClassFactory2::RequestLicKey, IClassFactory2::GetLicInfoi IClassFactory2::CreateInstanceLic. Gdy deweloper aplikacji kontenera wysyła żądanie utworzenia wystąpienia kontrolki, wykonywane jest wywołanie GetLicInfo w celu sprawdzenia, czy plik .LIC kontrolki jest obecny. Jeśli kontrolka jest licencjonowana, można utworzyć i umieścić w kontenerze instancję kontrolki. Po tym jak deweloper zakończył konstruowanie aplikacji kontenera, wykonano kolejne wywołanie funkcji, tym razem do RequestLicKey. Ta funkcja zwraca klucz licencji (prosty ciąg znaków) do aplikacji kontenera. Zwrócony klucz jest następnie osadzony w aplikacji.

Na poniższej ilustracji przedstawiono weryfikację licencji kontrolki ActiveX, która będzie używana podczas tworzenia aplikacji kontenera. Jak wspomniano wcześniej, deweloper aplikacji kontenerowej musi mieć odpowiedni plik .LIC zainstalowany na maszynie deweloperskiej w celu utworzenia wystąpienia kontrolki.

Licencjonowana kontrolka ActiveX zweryfikowana podczas opracowywania.
Weryfikacja licencjonowanej kontrolki ActiveX podczas opracowywania

Następny proces, pokazany na poniższym rysunku, występuje, gdy użytkownik końcowy uruchamia aplikację kontenera.

Po uruchomieniu aplikacji należy zwykle utworzyć wystąpienie kontrolki. Kontener wykonuje to przez wywołanie metody CreateInstanceLic, przekazując osadzony klucz licencji jako parametr. Następnie następuje porównanie ciągów między osadzonym kluczem licencji a własną kopią klucza licencji kontrolki. Jeśli dopasowanie zakończy się pomyślnie, zostanie utworzone wystąpienie kontrolki, a aplikacja będzie nadal wykonywana normalnie. Zwróć uwagę, że plik .LIC nie musi być obecny na komputerze użytkownika.

Licencjonowana kontrolka ActiveX zweryfikowana podczas wykonywania.
Weryfikacja licencjonowanej kontrolki ActiveX podczas wykonywania

Licencjonowanie kontroli składa się z dwóch podstawowych składników: określonego kodu w pliku DLL implementacji kontroli i pliku licencji. Kod składa się z dwóch (lub prawdopodobnie trzech) wywołań funkcji i ciągu znaku, określanego dalej jako "ciąg licencji", zawierający powiadomienie o prawach autorskich. Te wywołania i ciąg licencji znajdują się w implementacji kontrolki (. Plik CPP). Plik licencji wygenerowany przez Kreatora kontrolek ActiveX jest plikiem tekstowym z oświadczeniem o prawach autorskich. Jest nazwane przy użyciu nazwy projektu z rozszerzeniem .LIC, na przykład SAMPLE.LIC. Licencjonowana kontrolka musi być dołączona do pliku licencji, jeśli wymagane jest użycie w czasie projektowania.

Tworzenie licencjonowanej kontrolki

Jeśli używasz Kreatora kontrolek ActiveX do utworzenia struktury sterowania, łatwo jest uwzględnić obsługę licencjonowania. Po określeniu, że kontrolka powinna mieć licencję czasu wykonywania, Kreator kontrolek ActiveX dodaje kod do klasy kontrolnej w celu obsługi licencjonowania. Kod składa się z funkcji, które używają klucza i pliku licencji do weryfikacji licencji. Te funkcje można również zmodyfikować w celu dostosowania licencjonowania kontrolek. Aby uzyskać więcej informacji na temat dostosowywania licencji, zobacz Dostosowywanie licencjonowania kontrolki ActiveX w dalszej części tego artykułu.

Aby dodać obsługę licencjonowania za pomocą Kreatora kontrolek ActiveX podczas tworzenia projektu sterowania

  1. Skorzystaj z instrukcji w temacie Tworzenie kontrolki ActiveX MFC. Strona Ustawienia aplikacji Kreatora kontrolek ActiveX zawiera opcję utworzenia kontrolki z licencją czasu wykonywania.

Kreator kontrolek ActiveX generuje teraz strukturę kontrolek ActiveX, która obejmuje podstawową obsługę licencjonowania. Aby uzyskać szczegółowe wyjaśnienie kodu licencjonowania, zobacz następny temat.

Pomoc techniczna do licencjonowania

Gdy używasz Kreatora kontrolek ActiveX do dodawania obsługi licencjonowania do kontrolki ActiveX, Kreator kontrolek ActiveX dodaje kod, który deklaruje i implementuje funkcję licencjonowania. Kod ten jest umieszczany w nagłówku kontrolki oraz w plikach implementacji. Ten kod składa się z funkcji składowej VerifyUserLicense i funkcji składowej GetLicenseKey , która zastępuje domyślne implementacje znalezione w COleObjectFactory . Te funkcje pobierają i weryfikują licencję kontroli.

Uwaga / Notatka

Trzecia funkcja składowa VerifyLicenseKey nie jest generowana przez Kreatora kontrolek ActiveX, ale jest możliwa do zastąpienia w celu dostosowania działania weryfikacji klucza licencji.

Te funkcje członkowskie to:

  • VerifyUserLicense

    Sprawdza, czy kontrolka może być używana podczas projektowania, sprawdzając system pod kątem obecności pliku licencji kontroli. Ta funkcja jest wywoływana przez framework w ramach przetwarzania IClassFactory2::GetLicInfo i IClassFactory::CreateInstanceLic.

  • GetLicenseKey

    Żąda unikatowego klucza z biblioteki DLL sterownika. Ten klucz jest osadzony w aplikacji kontenerowej i później używany razem z elementem VerifyLicenseKey, aby utworzyć wystąpienie kontrolki. Ta funkcja jest wywoływana przez framework w ramach przetwarzania IClassFactory2::RequestLicKey.

  • VerifyLicenseKey

    Sprawdza, czy klucz osadzony i unikatowy klucz kontrolki są takie same. Dzięki temu kontener może utworzyć wystąpienie kontrolki na potrzeby jego działania. Ta funkcja jest wywoływana przez platformę w ramach przetwarzania IClassFactory2::CreateInstanceLic i może zostać zastąpiona w celu zapewnienia dostosowanej weryfikacji klucza licencji. Domyślna implementacja wykonuje porównanie ciągów. Aby uzyskać więcej informacji, zobacz Dostosowywanie licencjonowania kontrolki ActiveX w dalszej części tego artykułu.

Modyfikacje pliku nagłówka

Kreator kontrolek ActiveX umieszcza następujący kod w pliku nagłówka kontrolki. W tym przykładzie zadeklarowane są dwie funkcje składowe obiektu CSampleCtrlfactory, jedna, która weryfikuje obecność pliku .LIC kontrolki, a druga, która pobiera klucz licencji do użycia w aplikacji zawierającej tę kontrolkę.

BEGIN_OLEFACTORY(CMyAxUICtrl)        // Class factory and guid
   virtual BOOL VerifyUserLicense();
virtual BOOL GetLicenseKey(DWORD, BSTR FAR*);
END_OLEFACTORY(CMyAxUICtrl)

Modyfikacje pliku implementacji

Kreator kontrolek ActiveX umieszcza następujące dwie instrukcje w pliku implementacji kontrolki w celu zadeklarowania nazwy pliku licencji i ciągu licencji:

static const TCHAR BASED_CODE _szLicFileName[] = _T("NVC_MFC_AxUI.lic");

static const WCHAR BASED_CODE _szLicString[] = L"Copyright (c) 2006 ";

Uwaga / Notatka

Jeśli modyfikujesz szLicString w jakikolwiek sposób, musisz również zmodyfikować pierwszą linię w pliku kontrolnym .LIC, inaczej licencjonowanie nie będzie działać prawidłowo.

Kreator kontrolek ActiveX umieszcza następujący kod w pliku implementacji kontrolki w celu zdefiniowania klas VerifyUserLicense kontrolnych i GetLicenseKey funkcji:

// CMyAxUICtrl::CMyAxUICtrlFactory::VerifyUserLicense -
// Checks for existence of a user license

BOOL CMyAxUICtrl::CMyAxUICtrlFactory::VerifyUserLicense()
{
   return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName, _szLicString);
}

// CMyAxUICtrl::CMyAxUICtrlFactory::GetLicenseKey -
// Returns a runtime licensing key

BOOL CMyAxUICtrl::CMyAxUICtrlFactory::GetLicenseKey(DWORD /*dwReserved*/,
   BSTR FAR* pbstrKey)
{
   if (pbstrKey == NULL)
      return FALSE;

   *pbstrKey = SysAllocString(_szLicString);
   return (*pbstrKey != NULL);
}

Na koniec Kreator kontrolek ActiveX modyfikuje plik IDL projektu sterującego. Licencjonowane słowo kluczowe jest dodawane do deklaracji coclass kontrolki, jak pokazano w poniższym przykładzie.

[uuid(913E450B-E720-4C71-BCDF-71C96EE98FEB), licensed,
helpstring("MyAxUI Control"), control]
coclass NVC_MFC_AxUI

Dostosowywanie licencjonowania kontrolki ActiveX

Ponieważ VerifyUserLicense, GetLicenseKey i VerifyLicenseKey są deklarowane jako wirtualne funkcje składowe klasy fabrycznej sterowania, można dostosować zachowanie licencjonowania kontrolki.

Na przykład można udostępnić kilka poziomów licencjonowania dla kontroli, przesłaniając funkcje członkowskie VerifyUserLicense lub VerifyLicenseKey. Wewnątrz tej funkcji można dostosować właściwości lub metody widoczne dla użytkownika zgodnie z wykrytym poziomem licencji.

Możesz również dodać kod do VerifyLicenseKey funkcji, która udostępnia niestandardową metodę informowania użytkownika, że tworzenie kontrolki nie powiodło się. Na przykład w funkcji składowej VerifyLicenseKey można wyświetlić pole komunikatu z informacją, że kontrolka nie może się zainicjować oraz dlaczego.

Uwaga / Notatka

Innym sposobem dostosowania weryfikacji licencji kontroli ActiveX jest sprawdzenie bazy danych rejestracji dla określonego klucza rejestru, a nie wywołanie metody AfxVerifyLicFile. Aby zapoznać się z przykładem implementacji domyślnej, zobacz sekcję Modyfikacje pliku implementacji w tym artykule.

Aby zapoznać się z dodatkowym omówieniem problemów z licencjonowaniem, zobacz Problemy z licencjonowaniem w temacie Uaktualnianie istniejącej kontrolki ActiveX.

Zobacz także

Kontrolki ActiveX MFC
Kreator kontrolek ActiveX MFC