2012-01-16 69 views
2

我的應用程序使用LoadLibraryGetProcAddressFreeLibrary實現了一個插件體系結構。由於我的所有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等價物?

回答

2

的這裏的問題是,GetModuleFileNameNULL第一參數提供了可執行文件的路徑當前正在運行的代碼,而你想要的特定模塊是正在運行的代碼。所以,當你在NUnit下運行你的代碼時,你最終得到的是測試可執行文件而不是你所期望的。

你真正想要的是獲取當前正在執行的模塊的句柄,然後將其傳遞給GetModuleFileNameThis StackOverflow post詳細說明了一些獲取當前正在執行的模塊句柄的方法。

將當前模塊句柄與您當前擁有的代碼結合起來,這應該都在NUnit下工作。

+3

我總是喜歡記住模塊句柄,當它傳遞給'DllMain'中的DLL時。 – 2012-01-16 19:41:47

+0

@大衛:很好,我很驚訝那篇文章沒有提到。對於@dario_ramos:看看你的'DllMain'入口點(http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx),其中第一個參數是處理你的DLL。 – 2012-01-16 19:44:10

+0

@dario_ramos:我可能會誤解你的意思。這裏是我的概述:你有一些代碼(你的問題中的代碼)生活在某個DLL中,該DLL控制/管理在其他DLL中實現的插件,這些DLL位於相對於控制器/管理器DLL的某個目錄中。如果是這樣的話,你可以得到控制器/管理器DLL的句柄(通過我鏈接到的SO帖子,或者通過David的方法),通過GetModuleFileName獲得它的完整路徑,然後做任何你需要的操作您的插件目錄... – 2012-01-16 19:57:05