要獲得「父」dll的名稱,您可以創建一個函數作爲需要調用的API的一部分,該函數通過父DLL的HMODULE
句柄。
將get_current_module_handle()
函數創建爲inline
並將其封裝到某種宏中可以簡化客戶端代碼的過程。
//... control header
inline HMODULE get_current_module_handle() {/*...*/}
#define PARENT_MODULE get_current_module_handle()
void SetControlParent(HMODULE parent);
//... client code to initialise the "parent"
SetControlParent(PARENT_MODULE);
要獲得DLL名稱(孩子),你可以使用的GetModuleFileNameEx
和GetModuleHandleEx
功能的組合。技巧是在GetModuleHandleEx
函數中允許通過指向函數的指針(即dll中的函數)獲取模塊句柄;特別是使用標記GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
。
接下來是一些代碼應該做的訣竅片段;
HMODULE get_current_module_handle()
{
HMODULE moduleHandle = NULL;
if (!::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPCTSTR)get_current_module_handle, &moduleHandle))
throw std::runtime_error("unable to get the module handle");
return moduleHandle;
}
std::basic_string<TCHAR> get_module_name(HMODULE moduleHandle)
{
std::vector<TCHAR> filename(2048, _T('?')); // allocate some space
DWORD filenameLength = ::GetModuleFileNameEx(::GetCurrentProcess(), moduleHandle, &filename.front(), filename.size());
if (filenameLength && filenameLength < filename.size()) {
return std::basic_string<TCHAR>(&filename.front(), filenameLength);
}
return std::basic_string<TCHAR>(_T("unknown"));
}
//...
std::basic_string<TCHAR> dllname = get_module_name(get_current_module_handle()); // current dll
std::basic_string<TCHAR> parentdllname = get_module_name(parentHModule); // for "parent" dll
注的簡化版本被上述再現(基於OP 2048長度)。還提供了一個用於說明長文件名的遞歸實現(檢查編輯)。
dllname
將是該模塊的完全限定路徑,因此獲取基本文件名,功能如_splitpath
。或者,您可以直接在上面的代碼中使用GetModuleBaseName
。
std::basic_string<TCHAR> get_module_name(HMODULE moduleHandle)
{
std::vector<TCHAR> filename(MAX_PATH, _T('?')); // MAX_PATH is 260
DWORD filenameLength = ::GetModuleBaseName(::GetCurrentProcess(), moduleHandle, &filename.front(), filename.size());
if (filenameLength && filenameLength < filename.size()) {
return std::basic_string<TCHAR>(&filename.front(), filenameLength);
}
return std::basic_string<TCHAR>(_T("unknown"));
}
我不認爲有任何簡單的方法來做到這一點。一條痕跡可能? –
我明白這意味着你想要「父」DLL的名稱,加載你的DLL的名稱(見下文)。有了一些幫助,這並不難。 – Niall
安排X調用Y中的函數並提供信息 –