如何在DLL中,獲取DLL本身的路徑以及調用DLL的文件的路徑呢?主要通過GetModuleFileName(HMODULEhModule,LPTSTR lpFilename,DWORD nSize)函數來獲取,根據hModule參數來辨別是DLL本身還是DLL的調用者。
當hModule 為NULL時候 獲取到路徑為調用者,當hModule為main入口的
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
中的hModule的時候,獲取到的路徑是DLL本身的路徑。實例效果如下:

DLL文件的核心代碼如下:
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
TCHAR pCallFileName[MAX_PATH];
TCHAR pDllFileName[MAX_PATH];
::GetModuleFileName(NULL,pCallFileName,MAX_PATH);
ATL::CString strCall = pCallFileName;
strCall = L"調用EXE:" + strCall;
::GetModuleFileName(hModule,pDllFileName,MAX_PATH);
ATL::CString strTips = pDllFileName;
strTips = L"被調用DLL:"+strTips;
::MessageBox(NULL,strCall+L"\n"+strTips,L"MyDLL.dll",MB_OK);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
調用DLL文件的程序調用DLL代碼如下:
//靜態庫調用
#include "../LibTest/lib.h"
#pragma comment(lib,"../release/LibTest.lib")//指定與靜態庫一起鏈接
//dll 的靜態調用
#pragma comment(lib,"../release/MyDLL.lib")
extern "C" _declspec(dllexport) int sub(int x,int y);
//dll的動態調用
typedef int(*lpSubFun)(int,int);//宏定義函數指針類型
int _tmain(int argc, _TCHAR* argv[])
{
//靜態庫調用
//int rs = add(5,10);
//cout << rs <<endl;
//dll的靜態調用
//int rs2 = sub(100,33);
//cout << rs2 <<endl;
//dll的動態調用: LoadLibrary-GetProcAddress-FreeLibrary”
//系統Api提供的三位一體“DLL加載-DLL函數地址獲取-DLL釋放”方式
HINSTANCE hDll;//DLL句柄
lpSubFun subFunc;//函數指針
hDll = LoadLibrary(L"../release/MyDLL.dll");
if(hDll!=NULL)
{
subFunc = (lpSubFun)GetProcAddress(hDll,"sub");
}
if(subFunc!=NULL)
{
int rs3 = sub(100,88);
//cout << rs3 << endl;
}
//cin.get();
return 0;
}
