// 获取模块文件路径名
static bool GetModulePathName(CStdString& strModulePathName)
{
CStdString szUdlFileName;
TCHAR szModuleName[_MAX_PATH];
TCHAR szDrive[_MAX_PATH];
TCHAR szDir[_MAX_PATH];
TCHAR szFilename[_MAX_PATH];
TCHAR szExt[_MAX_PATH];
TCHAR szNewFile[_MAX_PATH];
TCHAR szFileData[_MAX_PATH];
TCHAR szCutFile[_MAX_PATH];
if (::GetModuleFileName(NULL, szModuleName, _MAX_PATH) == FALSE)
{// 在这里要注意了,GetModuleFileName第一个参数为NULL表示获取的名字是当前的可执行文件的路径,如果你写的段代码在一个dll中,那么你要获取dll的路径,就必须把dll的
// hModle传进来,可以见本文最后面的例子,告诉你怎么获取dll的hModule
return false;
}
::ZeroMemory(szDrive, sizeof(szDrive));
::ZeroMemory(szDir, sizeof(szDir));
::ZeroMemory(szFilename, sizeof(szFilename));
::ZeroMemory(szExt, sizeof(szExt));
::ZeroMemory(szNewFile, sizeof(szNewFile));
::ZeroMemory(szFileData, sizeof(szFileData));
// split the path
::_tsplitpath(szModuleName, szDrive, szDir, szFilename, szExt);
strModulePathName.Format("%s%s", szDrive, szDir);
return true;
}
/////////////////////////
BOOL APIENTRY DllMain(_In_ void * _HDllHandle, _In_ unsigned _Reason, _In_opt_ void * _Reserved)
{
switch(_Reason)
{
case DLL_PROCESS_ATTACH:
g_hModule = (HMODULE)_HDllHandle ;// 强制转换
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE ;
}
当然,对于HMODULE,DllMain它也传递过来的.
但MFC的DLL的话,因为自己并不写DllMain,所以得考虑GetModuleHandle/GetModuleHandleEx 在MFC的DLL中也可以用AfxGetInstanceHandle