现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

获取模块文件路径名

2012-08-27 06:52 工业·编程 ⁄ 共 1275字 ⁄ 字号 暂无评论

// 获取模块文件路径名
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 

给我留言

留言无头像?