我的應用程序使用LoadLibrary
,GetProcAddress
和FreeLibrary
實現了一個插件體系結構。由於我的所有DLL都在同一個目錄下的可執行文件,當我看一個DLL,我得到的可執行文件的目錄和搜索有,使用此功能:獲取當前可執行目錄在測試工具下失敗
string FileSystem::GetPathToProgramDirectory(){
char progname[MAX_PATH];
GetModuleFileNameA(NULL, progname, MAX_PATH);
PathRemoveFileSpecA(progname);
return string(progname);
}
這適用於生產,但是當我嘗試在使用NUnit的集成測試中運行此操作,可執行文件目錄最終爲NUnit,因此加載失敗。請記住,這是非託管C++;在託管的C++中,我使用Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location)
解決了這個問題,它可以在兩種情況下都能正常工作,但是非託管案例使我陷入了困境。是否有一個非託管的Winapi等價物?
我總是喜歡記住模塊句柄,當它傳遞給'DllMain'中的DLL時。 – 2012-01-16 19:41:47
@大衛:很好,我很驚訝那篇文章沒有提到。對於@dario_ramos:看看你的'DllMain'入口點(http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx),其中第一個參數是處理你的DLL。 – 2012-01-16 19:44:10
@dario_ramos:我可能會誤解你的意思。這裏是我的概述:你有一些代碼(你的問題中的代碼)生活在某個DLL中,該DLL控制/管理在其他DLL中實現的插件,這些DLL位於相對於控制器/管理器DLL的某個目錄中。如果是這樣的話,你可以得到控制器/管理器DLL的句柄(通過我鏈接到的SO帖子,或者通過David的方法),通過GetModuleFileName獲得它的完整路徑,然後做任何你需要的操作您的插件目錄... – 2012-01-16 19:57:05