MFC ActiveX 控制項:授權 ActiveX 控制項
授權支援是 ActiveX 控制項的選擇性功能,可讓您控制誰能夠使用或散發控制項。 (如需授權問題的其他討論,請參閱 中的 授權問題升級現有的 ActiveX 控制項 。
重要
ActiveX 是不應該用於新開發的舊版技術。 如需取代 ActiveX 的新式技術詳細資訊,請參閱 ActiveX 控制項 。
本文討論下列主題:
實作授權的 ActiveX 控制項可讓您身為控制項開發人員,以判斷其他人如何使用 ActiveX 控制項。 您可以使用 控制項和 提供控制項購買者。LIC 檔案,與購買者可以散發控制項的合約,但不能散發 。LIC 檔案,具有使用 控制項的應用程式。 這可防止該應用程式的使用者撰寫使用 控制項的新應用程式,而不需要先授權控制項。
ActiveX 控制項授權概觀
為了提供 ActiveX 控制項的授權支援, COleObjectFactory 類別提供介面中數個函式的 IClassFactory2
實作: IClassFactory2::RequestLicKey
、 IClassFactory2::GetLicInfo
和 IClassFactory2::CreateInstanceLic
。 當容器應用程式開發人員提出建立控制項實例的要求時,會呼叫 GetLicInfo
來確認控制項 。LIC 檔案存在。 如果控制項已獲得授權,則可以建立控制項的實例,並將其放在容器中。 在開發人員完成容器應用程式的建構之後,會呼叫另一個函式,這次對 RequestLicKey
進行 。 此函式會將授權金鑰(簡單字元字串)傳回至容器應用程式。 傳回的金鑰接著會內嵌在應用程式中。
下圖示范在開發容器應用程式期間將使用之 ActiveX 控制項的授權驗證。 如先前所述,容器應用程式開發人員必須具有適當的 。安裝在開發機器上的 LIC 檔案,以建立 控制項的實例。
開發期間授權的 ActiveX 控制項驗證
下圖所示的下一個程式會在使用者執行容器應用程式時發生。
啟動應用程式時,通常需要建立控制項的實例。 容器會藉由呼叫 CreateInstanceLic
來完成這項作業,並將內嵌授權金鑰傳遞為參數。 接著,在內嵌授權金鑰與控制項本身的授權金鑰複本之間進行字串比較。 如果比對成功,就會建立 控制項的實例,而且應用程式會繼續正常執行。 請注意, 。控制項使用者的電腦上不需要有 LIC 檔案。
在執行期間驗證授權的 ActiveX 控制項
控制項授權包含兩個基本元件:控制項實作 DLL 和授權檔中的特定程式碼。 程式碼是由兩個(或可能三個)函式呼叫和字元字串所組成,之後稱為「授權字串」,其中包含著作權聲明。 這些呼叫和授權字串可在控制項實作中找到(。CPP) 檔案。 ActiveX 控制項精靈所產生的授權檔案是具有著作權聲明的文字檔。 它會使用專案名稱搭配 來命名。LIC 延伸模組,例如 SAMPLE。LIC。 如果需要設計階段使用,授權控制項必須隨附授權檔。
建立授權控制項
當您使用 ActiveX 控制項精靈來建立控制項架構時,很容易包含授權支援。 當您指定控制項應該具有執行時間授權時,ActiveX 控制項精靈會將程式碼新增至控制項類別以支援授權。 程式碼是由使用金鑰和授權檔案進行授權驗證的函式所組成。 您也可以修改這些函式來自訂控制項授權。 如需授權自訂的詳細資訊,請參閱 本文稍後的自訂 ActiveX 控制項 授權。
當您建立控制項專案時,使用 ActiveX 控制項精靈新增授權支援
- 使用建立 MFC ActiveX 控制項 中的 指示。 ActiveX 控制項精靈的應用程式設定 頁面包含使用執行時間授權建立控制項的選項。
ActiveX 控制項精靈現在會產生包含基本授權支援的 ActiveX 控制項架構。 如需授權碼的詳細說明,請參閱下一個主題。
授權支援
當您使用 ActiveX 控制項精靈將授權支援新增至 ActiveX 控制項時,ActiveX 控制項精靈會新增宣告及實作授權功能的程式碼會新增至控制項標頭和實作檔案。 此程式碼是由成員函式和 GetLicenseKey
成員函式所組成 VerifyUserLicense
,其會覆寫 COleObjectFactory 中找到 的預設實作。 這些函式會擷取並驗證控制授權。
注意
第三個成員函式 VerifyLicenseKey
不是由 ActiveX 控制項精靈產生,但可以覆寫以自訂授權金鑰驗證行為。
這些成員函式包括:
-
藉由檢查系統是否有控制項授權檔案是否存在,驗證控制項是否允許設計階段使用。 架構會呼叫此函式做為處理
IClassFactory2::GetLicInfo
和IClassFactory::CreateInstanceLic
的一部分。 -
從控制項 DLL 要求唯一索引鍵。 此金鑰內嵌在容器應用程式中,稍後會與 搭配
VerifyLicenseKey
使用,以建立 控制項的實例。 架構會呼叫此函式,做為處理IClassFactory2::RequestLicKey
的一部分。 -
確認內嵌索引鍵和控制項的唯一索引鍵都相同。 這可讓容器建立 控制項的實例以供其使用。 架構會呼叫此函式作為處理的一
IClassFactory2::CreateInstanceLic
部分,並可覆寫以提供授權金鑰的自訂驗證。 預設實作會執行字串比較。 如需詳細資訊,請參閱 本文稍後的自訂 ActiveX 控制項 授權。
標頭檔修改
ActiveX 控制項精靈會將下列程式碼放在控制項標頭檔中。 在此範例中 factory
,會宣告 的兩個 物件成員函 CSampleCtrl
式,其中一個會驗證 控制項是否存在。LIC 檔案和另一個擷取要用於包含 控制項之應用程式中的授權金鑰:
BEGIN_OLEFACTORY(CMyAxUICtrl) // Class factory and guid
virtual BOOL VerifyUserLicense();
virtual BOOL GetLicenseKey(DWORD, BSTR FAR*);
END_OLEFACTORY(CMyAxUICtrl)
實作檔案修改
ActiveX 控制項精靈會在控制項實作檔案中放置下列兩個語句,以宣告授權檔案名和授權字串:
static const TCHAR BASED_CODE _szLicFileName[] = _T("NVC_MFC_AxUI.lic");
static const WCHAR BASED_CODE _szLicString[] = L"Copyright (c) 2006 ";
注意
如果您以任何方式修改 szLicString
,您也必須修改 控制項中的第一行。LIC 檔案或授權將無法正常運作。
ActiveX 控制項精靈會將下列程式碼放在控制項實作檔案中,以定義控制項類別的 VerifyUserLicense
和 GetLicenseKey
函式:
// 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);
}
最後,ActiveX 控制項精靈 會修改控制項專案 。IDL 檔案。 licensed 關鍵字會新增至 控制項的 coclass 宣告,如下列範例所示:
[uuid(913E450B-E720-4C71-BCDF-71C96EE98FEB), licensed,
helpstring("MyAxUI Control"), control]
coclass NVC_MFC_AxUI
自訂 ActiveX 控制項的授權
由於 VerifyUserLicense
、 GetLicenseKey
和 VerifyLicenseKey
宣告為控制項處理站類別的虛擬成員函式,因此您可以自訂控制項的授權行為。
例如,您可以覆寫 VerifyUserLicense
或 VerifyLicenseKey
成員函式,為控制項提供數個層級的授權。 在此函式中,您可以根據您偵測到的授權等級來調整要公開給使用者的屬性或方法。
您也可以將程式碼新增至 函式, VerifyLicenseKey
以提供自訂方法,以通知使用者控制項建立失敗。 例如,在您的 VerifyLicenseKey
成員函式中,您可以顯示訊息方塊,指出控制項無法初始化,以及原因。
注意
自訂 ActiveX 控制項授權驗證的另一種方式是檢查特定登錄機碼的註冊資料庫,而不是呼叫 AfxVerifyLicFile
。 如需預設實作的範例,請參閱 本文的<實作檔案修改 >一節。
如需授權問題的其他討論,請參閱升級現有 ActiveX 控制項 中的 授權問題。