DeskBand가 실현한 네 가지 함수
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);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.