공급자 언로드

WMI가 공급자로 완료되면 메모리에서 공급자를 언로드합니다. WMI가 공급자를 언로드하는 주된 이유는 시스템 리소스를 절약하기 위한 것입니다. 따라서 WMI가 효율적인 방식으로 공급자를 언로드할 수 있도록 하는 코드를 추가해야 합니다. 캐시 제어에 지정된 간격에서 WMI가 공급자를 언로드하는 간격의 두 배까지 걸립니다.

WMI는 다음 방법 중 하나로 공급자를 언로드합니다.

  • 공급자가 제공된 작업을 완료한 후 공급자를 언로드합니다.
  • 사용자가 시스템을 종료할 때 모든 공급자를 신속하게 언로드합니다. WMI 서비스가 명령줄에서 종료되면 WMI는 In-process 공급자를 언로드합니다.

첫 번째 시나리오가 더 일반적이지만 두 가지 가능성에 대해 공급자를 작성해야 합니다.

이 항목에서 다루는 섹션은 다음과 같습니다.

유휴 공급자 언로드

WMI는 유휴 공급자를 언로드할 때 다음 작업을 수행합니다.

  • 공급자가 유휴 상태인지 확인합니다.

    WMI는 ClearAfter 속성을 사용하여 공급자를 언로드하기 전에 공급자가 유휴 상태를 유지할 수 있는 기간을 결정합니다. 자세한 내용은 공급자의 유휴 시간 액세스를 참조하세요.

  • 공급자의 Release 메서드를 호출합니다.

    공급자가 순수 공급자인 경우 Release는 활성 메모리에서 공급자를 완전히 제거합니다. 그러나 WMI가 Release를 호출한 후에도 순수하지 않은 공급자가 계속 실행될 수 있습니다.

공급자의 유휴 시간 액세스

공급자가 활성 상태로 유지되는 최소 시간은 ClearAfter 속성에 의해 결정됩니다. ClearAfter는 \root 네임스페이스의 WMI 시스템 클래스 __CacheControl에서 파생된 클래스의 인스턴스에서 찾을 수 있습니다.

다음 목록에서는 공급자 언로드를 제어하는 __CacheControl에서 파생된 클래스에 대해 설명합니다.

특정 유형의 공급자에 대한 캐시 제어 인스턴스의 ClearAfter 속성을 편집하여 WMI에서 공급자가 비활성 상태로 유지되도록 허용하는 최소 시간을 변경할 수 있습니다. 예를 들어 속성 공급자가 유휴 상태를 유지할 수 있는 시간을 제한하려면 \root 네임스페이스에 있는 __PropertyProviderCacheControl 인스턴스의 ClearAfter 속성을 편집합니다.

WMI 클라이언트이기도 한 공급자 언로드

공급자가 수행하도록 호출된 공급자 함수를 완료한 후 WMI의 클라이언트를 유지해야 할 수 있습니다. 예를 들어 푸시 공급자는 WMI에 대한 쿼리를 실행해야 할 수 있습니다. 자세한 내용은 밀어넣기 또는 끌어오기 상태 확인을 참조하세요. 이 경우 공급자를 나타내는 __Win32Provider 인스턴스의 Pure 속성을 TRUE로 설정해야 합니다. Pure 속성이 FALSE로 설정된 경우 공급자는 WMI가 기본 인터페이스의 Release 메서드를 호출할 때 모든 미해결 인터페이스 지점에서 IUnknown::Release를 호출하여 언로드를 준비합니다. 자세한 내용은 __Win32Provider의 주의 섹션을 참조하세요.

다음 절차에서는 공급자의 기본 인터페이스에 대한 release 메서드를 구현하는 방법을 설명합니다.

공급자를 언로드하려면

  1. WMI가 공급자의 기본 인터페이스에 대한 Release 메서드를 호출할 때 WMI에 대해 유지되는 모든 인터페이스 포인터를 해제합니다.

    일반적으로 공급자는 IWbemProviderInit::Initialize에 제공된 IWbemServicesIWbemContext 인터페이스에 대한 포인터를 보유합니다.

  2. 연결된 __Win32Provider 인스턴스의 Pure 속성이 FALSE로 설정된 경우 공급자는 WMI가 Release를 호출한 후 클라이언트 애플리케이션의 역할로 전환할 수 있습니다. 그러나 WMI는 클라이언트 시스템으로 작동하는 공급자를 언로드할 수 없으므로 시스템 오버헤드가 증가합니다.

    PureTRUE로 설정된 공급자는 서비스 요청에 대해서만 존재합니다. 따라서 이 유형의 공급자는 클라이언트 애플리케이션의 역할을 수행할 수 없으며 WMI는 이를 언로드할 수 있습니다.

종료 중 공급자 언로드

정상적인 상황에서는 WMI 클라이언트이기도 한 공급자 언로드의 지침을 사용하면 WMI가 공급자를 제대로 언로드할 수 있습니다. 그러나 사용자가 시스템을 종료하도록 선택하는 경우와 같이 WMI가 일반적인 언로드 절차를 발생시킬 수 없는 상황이 나타날 수 있습니다. 데이터 스토리지의 트랜잭션 모델을 사용하여 적절한 정리 전략을 구현하는 것 외에도 공급자가 제대로 언로드되었는지 확인할 수 있습니다.

사용자는 언제든지 WMI를 중지할 수 있습니다. 이러한 상황에서 WMI는 모든 공급자를 언로드하거나 In-process 공급자에서 DllCanUnloadNow 진입점을 호출하지 않습니다. 또한 In-Process 공급자가 종료 시에 메서드 호출이 진행되고 있는 경우 WMI는 호출 중간에 실행 중인 스레드를 종료할 수 있습니다. 이 경우 WMI는 일반적으로 정리를 처리하는 루틴을 호출하지 않습니다(예: 개체 소멸자). 기껏해야 WMI는 DllMain만 호출합니다.

운영 체제가 WMI를 종료하면 시스템은 in-process 공급자에게 할당된 모든 메모리를 자동으로 해제합니다. 또한 운영 체제는 파일 핸들, 창 핸들 등과 같이 공급자가 보유한 대부분의 리소스를 닫습니다. 공급자는 이를 위해 특정 작업을 수행할 필요가 없습니다.

WMI는 호출 중간에 종료할 수 있으므로 공급자는 데이터 원본을 일관되지 않은 상태로 두면 안 됩니다. 데이터를 일관되지 않은 상태로 두더라도 읽기 전용 공급자에게 문제가 되지는 않습니다. 그러나 쓰기 기능이 있는 공급자는 갑작스러운 종료 후 안전한 롤백을 허용하도록 일종의 트랜잭션 모델을 구현하려고 할 수 있습니다.

운영 체제에서 일부 일반 시스템 리소스를 해제할 수 있지만 시스템에서 모든 리소스를 자동으로 해제하지는 않습니다. 예를 들어 운영 체제는 소켓 또는 데이터베이스 연결을 해제할 수 없습니다. 대신 공급자는 이러한 리소스를 수동으로 정리해야 할 수 있습니다. 이러한 문제를 방지하려면 공급자를 out-of-process로 구현하거나 정리 코드를 추가할 수 있습니다.

가장 간단한 솔루션은 공급자를 out-of-process로 구현하는 것입니다. WMI는 COM 시간 제한 후에 공급자를 해제하지만 WMI가 종료될 때 out-of-process 공급자는 종료되지 않습니다. 정리 및 종료 견고성 문제가 성능보다 더 중요한 공급자는 out-of-process일 수 있습니다.

공급자에 정리 코드를 배치해야 하는 경우 두 가지 옵션이 있습니다. 이러한 종류의 정리를 수행할 위치 중 하나는 DLL을 언로드할 때 운영 체제에서 호출하는 DLL 진입점 함수인 DllMain입니다. 정리 코드는 DllMain에 직접 추가하여 DLL_PROCESS_DETACH에 대한 응답으로 실행할 수 있습니다. DllMain에서 정리 코드를 구현하는 것은 특히 MFC 또는 ATL과 같은 프로그래밍 환경에서는 다소 어려울 수 있습니다. 자세한 내용은 Microsoft 기술 자료 문서 Q148791 "MFC 기본 DLL에서 사용자 고유의 DllMain을 제공하는 방법"을 참조하세요. 일부 언어 및 국가/지역에서는 이 리소스를 사용할 수 없습니다.

또는 전역 클래스의 소멸자에 정리 코드를 배치할 수도 있습니다. 자세한 내용은 공급자 언로드를 참조하세요. Windows 운영 체제는 힙에 전역 개체를 할당하지 않습니다. 대신 운영 체제는 DLL 언로드 중에 소멸자를 호출합니다.

다음은 WMI에 대한 전역 개체 내에서 사용될 수 있는 간단한 정리 프로시저입니다.

class CMyCleanup
{
    ~CMyCleanup()
    {
        CloseHandle(m_hOpenFile);
        CloseDatabaseConnection(g_hDatabase);
    }
} g_Cleanup;

두 방법 중 하나를 사용하여 정리 코드에서 수행할 수 있는 작업과 관련하여 많은 제한 사항이 있습니다. 예를 들어 암시적으로 연결되지 않은 스레드나 DLL은 어떤 방식으로도 액세스할 수 없습니다. 또한 어떤 상황에서도 COM을 호출할 수 없습니다.

네임스페이스 보안 설명자 설정

공급자 보안

WMI 공급자 개발