DLL에서 자체 핸들을 가져오는 방법

2731 단어 DLLVC/MFC
제목:
EXE 하나에 DLL 이 로드됩니다.DLL에서 DLL 자체의 실례 핸들을 동적으로 가져오려고 합니다.무슨 방법이 있습니까?
DllMain에서 글로벌 핸들을 저장하는 방법을 사용하고 싶지 않습니다.
설명:
(1) MFC 확장 DLL
int DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 첫 번째 매개변수는 DLL 핸들입니다.
(2) WIN32DLL
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul reason for call, LPVOID lpReserved)의 첫 번째 매개변수는 DLL 핸들입니다.
(3) WIN32에서 MFC 옵션을 선택한 DLL에서 DLL 핸들을 가져오는 것은 비교적 번거롭다.
예: DownLoader DLLTEst.exe에서 DownLoaderDLL을 동적으로 로드합니다.dll 이후 DLL에서GetModuleHandle () 을 통해서도 dll이 아닌 exe 핸들을 가져옵니다.
dll 이름을 지정하지 않으면 HMODULE hDll =::GetModuleHandle ("DownLoader Win32MfcdL.dll")그래야 dll 모듈 핸들을 얻을 수 있고,
그러나 일반적인 조건하에서 우리의 모듈 명칭은 죽을 수 없고,
  1:
  :TRUE   DLL     1,FALSE        ,   FALSE
HMODULE GetCurrentModule(BOOL bRef/* = FALSE*/)
{
	HMODULE hModule = NULL;
	if (GetModuleHandleEx(bRef ? GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS : (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 
	| GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), 	(LPCSTR)GetCurrentModule, &hModule))
	{
		return hModule;
	}
	
	return NULL;
}
  2:
  :http://blog.csdn.net/yaosan/article/details/3459756
HMODULE GetSelfModuleHandle()
{
	MEMORY_BASIC_INFORMATION mbi;
	
	return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0) 
	      ? (HMODULE) mbi.AllocationBase : NULL);
}

추가 설명:

GetModuleHandle () 및 GetModuleHandleEx () 설명


GetModuleHandle () 및 GetModuleHandleEx ()
이 두 함수는 호출 프로세스에 비친 모듈을 가져오는 데 사용되는 핸들입니다.
1. GetModuleHandle(lpModuleName) lpModuleName은 모듈의 이름이며 **일 수 있습니다.dll 또는 **.exe, 확장자가 없으면 기본값은 dll입니다.모듈 이름이 경로로 지정된 경우 경로에 "/"대신 "\"를 사용해야 합니다.실행할 때, 이 함수는 이름 (대소문자 민감하지 않음) 을 통해 호출 프로세스가 비친 모듈을 보고, 일치하는 모듈 핸들을 되돌려줍니다.
GetModuleHandle(NULL)이 있으면 호출 프로세스 자체의 핸들을 반환합니다.
성공하면 핸들, 실패, NULL로 돌아갑니다.오류 정보: GetLastError()
ps:GetModuleHandle 함수는 지정한 모듈의 인용수를 증가시키지 않습니다. 즉, 이 함수를 몇 번 호출하든지 상관없이FreeLibrary 함수를 한 번 호출하면 이 모듈은 프로세스에서 마운트 해제됩니다.다중 루틴에서, 모듈 핸들은 서로 다른 루틴에서 항상 유효하지 않다.예를 들어, 한 라인에서 이 함수를 호출해서 모듈의 핸들을 가져왔지만, 이 핸들을 사용하기 전에 다른 라인이 핸들을 프리하고 다른 모듈의 핸들을 다시 가져옵니다.이때 첫 번째 라인에서 이 핸들 변수를 사용하면 이전에 조작하려고 했던 모듈이 아니라 두 번째 라인이 수정된 모듈 핸들이 된다.
2. GetModuleHandleEx(dwFlags,lpModuleName,phModule)dwFlags: 0이면 이 함수를 호출할 때 모듈의 인용 계수가 자동으로 증가하고 호출자는 모듈 핸들을 사용한 후 FreeLibrary를 한 번 호출해야 한다GETMODULE_HANDLE_EX_FLAG_PIN, FreeLibrary가 GET 인 경우 프로세스가 끝날 때까지 이 함수를 호출하는 프로세스에 모듈이 매핑됩니다.MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, GetModuleHandle과 동일하며, GETMODULE_HANDLE_EX_FLAG_FROM_ADDRESS, lpModuleName 은 모듈의 주소입니다.
phModule은 찾을 핸들을 저장합니다.기타는 GetModuleHandle 함수와 동일

좋은 웹페이지 즐겨찾기