DLL에서 자체 핸들을 가져오는 방법
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 함수와 동일
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
VB에서 VC로 작성된 DLL을 호출하는 방법 공유이 두 가지가 있으면 VC를 사용하는 수조처럼 처리할 수 있습니다.도면을 내보내는 경우 WMF 또는 BMP 형식을 생성하여 VB를 호출할 수 있습니다.그러나 나는 VB가 창의 핸들 hWnd와 hDC, 그리고 창의 그...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.