ActiveX 컨트롤의 선택적 기능인 라이선스 지원을 사용하면 컨트롤을 사용하거나 배포할 수 있는 사용자를 제어할 수 있습니다. (라이선스 문제에 대한 추가 논의는 기존 ActiveX 컨트롤 업그레이드의 라이선스 문제를 참조하세요.)
중요합니다
ActiveX는 새로운 개발에 사용해서는 안 되는 레거시 기술입니다. ActiveX를 대체하는 최신 기술에 대한 자세한 내용은 ActiveX 컨트롤을 참조하세요.
이 문서에서는 다음과 같은 내용을 다룹니다.
라이선스를 구현하는 ActiveX 컨트롤을 사용하면 컨트롤 개발자로서 다른 사용자가 ActiveX 컨트롤을 사용하는 방법을 결정할 수 있습니다. 컨트롤 구매자에게 컨트롤과 .LIC 파일을 제공합니다. 구매자는 컨트롤을 사용할 수 있는 애플리케이션과 함께 컨트롤을 배포할 수 있지만, .LIC 파일은 배포할 수 없습니다. 이렇게 하면 해당 애플리케이션의 사용자가 컨트롤의 라이선스를 먼저 부여하지 않고 컨트롤을 사용하는 새 애플리케이션을 작성할 수 없습니다.
ActiveX 컨트롤 라이선스 개요
ActiveX 컨트롤에 대한 라이선스 지원을 제공하기 위해 COleObjectFactory 클래스는 인터페이스IClassFactory2의 여러 함수 IClassFactory2::RequestLicKey 에 대한 구현을 IClassFactory2::GetLicInfoIClassFactory2::CreateInstanceLic제공합니다. 컨테이너 애플리케이션 개발자가 컨트롤의 인스턴스를 생성하도록 요청할 때, 컨트롤의 .LIC 파일이 있는지 확인하기 위해 GetLicInfo이 호출됩니다. 컨트롤의 사용이 허가된 경우 컨트롤의 인스턴스를 만들어 컨테이너에 배치할 수 있습니다. 개발자가 컨테이너 애플리케이션 생성을 완료하면 이번에는 RequestLicKey또 다른 함수 호출이 수행됩니다. 이 함수는 컨테이너 애플리케이션에 라이선스 키(단순 문자 문자열)를 반환합니다. 그런 다음 반환된 키가 애플리케이션에 포함됩니다.
아래 그림에서는 컨테이너 애플리케이션을 개발하는 동안 사용할 ActiveX 컨트롤의 라이선스 확인을 보여 줍니다. 앞서 설명한 것처럼, 컨테이너 애플리케이션 개발자는 컨트롤의 인스턴스를 생성하기 위해 개발 컴퓨터에 적절한 .LIC 파일을 설치해야 합니다.
개발 중에 사용이 허가된 ActiveX 컨트롤 확인
다음 그림에 표시된 다음 프로세스는 최종 사용자가 컨테이너 애플리케이션을 실행할 때 발생합니다.
애플리케이션이 시작되면 일반적으로 컨트롤 인스턴스를 만들어야 합니다. 컨테이너는 포함된 라이선스 키를 매개 변수로 전달하여 CreateInstanceLic을 호출함으로써 이를 수행합니다. 그런 다음 포함된 라이선스 키와 컨트롤의 라이선스 키 복사본 간에 문자열을 비교합니다. 일치가 성공하면 컨트롤의 인스턴스가 만들어지고 애플리케이션이 정상적으로 계속 실행됩니다. 참고로, LIC 파일은 제어 사용자의 컴퓨터에 있을 필요가 없습니다.
실행 중 사용이 허가된 ActiveX 컨트롤 확인
컨트롤 라이선스는 컨트롤 구현 DLL의 특정 코드와 라이선스 파일의 두 가지 기본 구성 요소로 구성됩니다. 이 코드는 2개(또는 3개) 함수 호출과 문자 문자열로 구성되며, 이 문자열은 저작권 고지를 포함하는 "라이선스 문자열"이라고 합니다. 이러한 호출 및 라이선스 문자열은 컨트롤 구현 파일(.CPP)에서 찾을 수 있습니다. ActiveX 컨트롤 마법사에서 생성된 라이선스 파일은 저작권 설명이 있는 텍스트 파일입니다. 프로젝트 이름에 따라 .LIC 확장자를 붙여 SAMPLE.LIC처럼 명명됩니다. 디자인 타임 사용이 필요하면 라이선스 파일이 라이선스 컨트롤과 함께 있어야 합니다.
라이선스가 있는 컨트롤 만들기
ActiveX 컨트롤 마법사를 사용하여 컨트롤 프레임워크를 만드는 경우 라이선싱 지원을 쉽게 포함할 수 있습니다. 컨트롤에 런타임 라이선스가 있어야 한다고 지정하면 ActiveX 컨트롤 마법사는 라이선스를 지원하기 위해 컨트롤 클래스에 코드를 추가합니다. 코드는 라이선스 확인을 위해 키 및 라이선스 파일을 사용하는 함수로 구성됩니다. 이러한 함수는 컨트롤 라이선스를 사용자 지정하도록 수정할 수도 있습니다. 라이선스 사용자 지정에 대한 자세한 내용은 이 문서의 뒷부분에 있는 ActiveX 컨트롤의 라이선스 사용자 지정 을 참조하세요.
컨트롤 프로젝트를 만들 때 ActiveX 컨트롤 마법사를 사용하여 라이선스에 대한 지원을 추가하려면
- MFC ActiveX 컨트롤 만들기의 지침을 사용합니다. ActiveX 컨트롤 마법사의 애플리케이션 설정 페이지에는 런타임 라이선스를 사용하여 컨트롤을 만드는 옵션이 포함되어 있습니다.
이제 ActiveX 컨트롤 마법사는 기본 라이선싱 지원을 포함하는 ActiveX 컨트롤 프레임워크를 생성합니다. 라이선스 코드에 대한 자세한 설명은 다음 항목을 참조하세요.
라이선스 지원
ActiveX 컨트롤 마법사를 사용하여 ActiveX 컨트롤에 라이선스 지원을 추가하는 경우 ActiveX 컨트롤 마법사는 라이선스 기능을 선언하고 구현하는 코드를 컨트롤 헤더 및 구현 파일에 추가합니다. 이 코드는 VerifyUserLicense에 있는 기본 구현을 재정의 GetLicenseKey 하는 멤버 함수 및 멤버 함수로 구성됩니다. 이러한 함수는 컨트롤 라이선스를 검색하고 확인합니다.
비고
세 번째 멤버 함수 VerifyLicenseKey 는 ActiveX 컨트롤 마법사에서 생성되지 않지만 라이선스 키 확인 동작을 사용자 지정하도록 재정의할 수 있습니다.
이러한 멤버 함수는 다음과 같습니다.
-
컨트롤 라이선스 파일의 존재 여부를 시스템에 확인하여 컨트롤에서 디자인 타임 사용을 허용하는지 확인합니다. 프레임워크는
IClassFactory2::GetLicInfo및IClassFactory::CreateInstanceLic처리를 일부로 이 함수를 호출합니다. -
컨트롤 DLL에서 고유 키를 요청합니다. 이 키는 컨테이너 애플리케이션에 포함되며 나중에 컨트롤의 인스턴스를 만들기 위해 함께
VerifyLicenseKey사용됩니다. 이 함수는 처리IClassFactory2::RequestLicKey의 일부로 프레임워크에서 호출됩니다. -
포함된 키와 컨트롤의 고유 키가 동일한지 확인합니다. 이렇게 하면 컨테이너가 사용할 컨트롤의 인스턴스를 만들 수 있습니다. 이 함수는 처리
IClassFactory2::CreateInstanceLic의 일부로 프레임워크에서 호출되며 라이선스 키에 대한 사용자 지정 확인을 제공하도록 재정의할 수 있습니다. 기본 구현은 문자열 비교를 수행합니다. 자세한 내용은 이 문서의 뒷 부분에 있는 ActiveX 컨트롤의 라이선스 사용자 지정을 참조하세요.
헤더 파일 수정
ActiveX 컨트롤 마법사는 컨트롤 헤더 파일에 다음 코드를 배치합니다. 이 예제에서는 객체 CSampleCtrl의 두 멤버 함수 factory가 선언됩니다. 하나는 컨트롤 .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 파일을 수정합니다. 라이선스가 부여된 키워드는 다음 예제와 같이 컨트롤의 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 컨트롤 업그레이드의 라이선스 문제를 참조하세요.