현재 프로그램(.exe) 및 동적 라이브러리(.dll)가 있는 경로 가져오기

2079 단어
1. 현재 프로그램의 경로를 가져옵니다
BOOL CLicenseCtrlDlg::GetAppPath(void)
{
	CString strAppPath;  //     
	TCHAR szModuleFileName[MAX_PATH]; //     
	TCHAR drive[_MAX_DRIVE];  //     ,   C  ,D  
	TCHAR dir[_MAX_DIR]; //   
	TCHAR fname[_MAX_FNAME];  //     
	TCHAR ext[_MAX_EXT]; //  ,   exe   dll
	if (NULL == GetModuleFileName(NULL, szModuleFileName, MAX_PATH)) //           
	{
		AfxMessageBox("        !");
		return FALSE;
	}
	_tsplitpath( szModuleFileName, drive, dir, fname, ext );  //     ,    ,  ,   ,   
	m_ConfigPath = drive;
	m_ConfigPath += dir;
	return TRUE;
}

2. 현재 프로그램이 호출한test를 가져옵니다.dll 동적 라이브러리 위치 경로
//           
HINSTANCE exe_hInstance = ::GetModuleHandle(NULL);
//    dll   
HINSTANCE dll_hInstance = ::GetModuleHandle(_T("PSDLib.dll"));
//         
AfxSetResourceHandle(dll_hInstance);
//       
AfxSetResourceHandle(exe_hInstance);

현재 프로그램의 경로 가져오기 방법에서 호출
GetModuleFileName(NULL, szModuleFileName, MAX_PATH))

시 첫 번째 매개 변수 선택 dllhinstance, 동적 라이브러리 경로 획득
3. 두 개의 동적 라이브러리 A와 B가 있는데 A는 B를 동적으로 호출했다. A에서 B로 파라미터를 전달하는 방법을 사용하지 않고 B에서 A의 경로를 어떻게 얻는가.
------------------------------GetModuleHandle("A")은 동적 라이브러리 A의handle을 획득한 다음,GetModuleFileName(A의handle,lpFileName,nSize)을 호출하면 됩니다------------------------------------------------GetModuleFileName()을 호출하여 A의 핸들을 전달하면 모듈 경로를 얻을 수 있습니다--------------------------------------------------------------------------------------------------------------------------------즉 함수가 호출하기 전에 호출자가 창고에 쌓인 되돌아오는 주소를 눌러준다는 것이다.이 주소에서 DLL 모듈 핸들을 가져옵니다.이 DLL 핸들을 기반으로 전체 경로를 가져옵니다.------------------------B.dll
#ifdef __cplusplus
extern "C"
#endif
void * _ReturnAddress(void);
#pragma intrinsic(_ReturnAddress)

int funB()
{
HMODULE hCaller = NULL; 
TCHAR szModuleName[MAX_PATH]; 
void *pRetAddr = _ReturnAddress(); 
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)pRetAddr, &hCaller);  
GetModuleFileName(hCaller, szModuleName, _countof(szModuleName));

....  
  
}

좋은 웹페이지 즐겨찾기