DeskBand가 실현한 네 가지 함수

2745 단어
DeskBand에 대해 말하자면, 이것은 DLL일 뿐만 아니라, COM 대상이기도 하며, 이것은 explorer가 호출한 것이다.DLL에 대해 말하자면, 그것은 몇 개의 함수가 있는데, 상당히 중요하다. 본고는 이 몇 개의 함수에 대해 간단한 설명을 한다.
    1,DllMain
    2,DllGetClassObject
    3,DllCanUnloadNow
    4,DllRegisterServer
    5,DllUnregisterServer
여기서 함수 2-5는 클라이언트와 통신하는 인터페이스로 내보내야 합니다.
다음은 이 다섯 함수에 대해 설명한다.
 

    1,DllMain


DLL의 엔트리 포인트 함수입니다.시스템은 서로 다른 시간에 이 진입점 함수를 호출합니다. 이 호출은 DLL을 저장하는 Instance와 같은 정보를 제공할 수 있습니다. 보통 DLL을 대신해서 모든 프로세스나 루틴의 초기화와 제거 작업을 할 수 있습니다.만약 DLL에서 이러한 알림 정보를 필요로 하지 않는다면, DLL 소스 코드에서 이 함수를 실현할 필요가 없습니다. 예를 들어 자원만 포함하는 DLL을 만들면 이 함수를 실현할 필요가 없습니다.이 함수는 일반적으로 프로세스나 루틴의 초기화와 지우기 작업을 합니다. DllMain 함수가 실행될 때 같은 주소 공간의 다른 DLL은 DllMain 함수를 실행하지 않을 수 있습니다. 이것은 DllMain 함수가 아직 시작되지 않았음을 의미하기 때문에 다른 DLL에서 출력된 함수를 호출하는 것을 피해야 합니다.또한 DllMain 내부에서 LoadLibrary와 FreeLibrary 함수를 호출하는 것을 피해야 한다. 왜냐하면 이 함수들은 의존적인 순환을 형성하기 때문이다.
 

    2,DllGetClassObject


이 함수는 상당히 중요하다. 그것은 반드시 출력 함수이어야 한다.이것은 클래스 공장을 만들고 클래스 공장 안에서 사용자 정의의COM 대상을 만드는 데 사용됩니다.이 함수를 직접 호출하지 마라.구현을 살펴보십시오.
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
{
    // CLSID_SdkDeskBand       COM CLSID
    HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
    if ( TRUE == IsEqualCLSID(rclsid, CLSID_SdkDeskBand) )
    {
        hr = E_OUTOFMEMORY;
        //             ,            COM  
        SdkClassFactory *pClassFactory = new SdkClassFactory();
        if ( NULL != pClassFactory )
        {
            hr = pClassFactory->QueryInterface(riid, ppv);
        }
        SAFE_RELEASE(pClassFactory);
    }
    return hr;
}

    3,DllCanUnloadNow


이 함수는 OS가 DLL을 마운트 해제할 수 있는지를 알려 줍니다. 이 함수는 일반적으로 비교적 간단하고, 전역 핸들을 닫고 LOG를 쓸 수도 있습니다.
STDAPI DllCanUnloadNow()
{
    // g_lDllRefCount   DLL     ,
    //         0  ,       DLL,     。
    return (g_lDllRefCount > 0) ? S_FALSE : S_OK;
}

    4,DllRegisterServer


이 DLL을 등록할 때 이 함수를 호출합니다. 전형적인 것은regsvr32 명령으로 DLL을 등록할 때 이 함수를 호출합니다. 일반적으로 이 함수 안에서 등록을 할 수 있습니다. 예를 들어 등록표를 작성하고 현재 DLL의 유형을 등록할 수 있습니다.
 

    5,DllUnregisterServer


regsvr32/u로 이 DLL을 마운트 해제할 때 이 방법을 사용합니다. 이 방법에서 할 일은 등록표에서 쓴 값을 삭제하는 것입니다.이 함수가 호출된 후에 일반적인 DLL은 바로 삭제될 수 없고 OS에 순환 메커니즘이 있기 때문에 대략 시간이 좀 걸리면 이 DLL은 삭제할 수 있다.바로 삭제할 수 있도록 이 함수에 다음 코드를 추가할 수 있습니다.
    // Find handle to the task bar.
    // hTaskbarWnd Desk Band     
    HWND hTaskbarWnd = FindWindow(L"Shell_TrayWnd", NULL);
    // If task bar receives this message, it will call CoFreeUnusedLibraries function
    // immediately to free unused libraries.
    PostMessage(hTaskbarWnd, WM_TIMER, 24, 0);

좋은 웹페이지 즐겨찾기