DLL中如何獲取自身的路徑
來源:程序員人生 發布時間:2015-07-03 09:03:29 閱讀次數:3159次
問題:DLL中如何獲得DLL本身所在的文件夾,而不是主調程序的。用GetCurrentDirectory獲得的是exe主調程序所在的目錄,不符合我的要求;用GetModuleFileName只能在DllMain中才能獲得到,由于DllMain第1個參數hInstance就是DLL模塊局并,而GetModuleFileName()只有傳入DLL模塊句柄才能獲得DLL路徑。
但是,如果不是DllMain項目,而是Win32
DLL勾選MFC選項的項目,入口函數是int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]),沒有DllMain那樣的入參hInstance,又該如何獲得DLL的模塊句柄呢?
方法1:需要傳入DLL句柄
使用1個全局變量保存DllMain中的hInstance,然后在你需要的地方傳給::GetModuleFileName()。
方法2:需要傳入DLL名稱
HMODULE hMod = GetModuleHandle(_T("mydll.dll"));
if(hMod != NULL)
{
TCHAR szBuffer[MAX_PATH] = {0};
GetModuleFileName(hMod, szBuffer, sizeof(szBuffer) / sizeof(TCHAR) - 1);
}
方法3:通用辦法
TCHAR szDLLFolder[MAX_PATH + 1];
GetModuleFileName(AfxGetApp()->m_hInstance, szDLLFolder, MAX_PATH);
//或GetModuleFileName(::AfxGetResourceHandle(), szDLLFullPath, MAX_PATH);
//或GetModuleFileName(::AfxGetInstanceHandle(), szDLLFullPath, MAX_PATH);
先補充說明1下,VC有3種DLL項目:
(1)MFC擴大DLL (dll被加載自動進入入口函數DllMain,但最好通過導出接口來使用)
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
(2)Win32標準DLL (dll被加載自動進入入口函數DllMain,但最好通過導出接口來使用)
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
(3)Win32勾選MFC選項DLL(
dll被加載不會進入函數_tmain(),只能提供導出接口)
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈