直到現在,我還有某種插件機制,我使用LoadLibrary和GetProcAddress加載dll來創建具體對象並返回一個通用接口。這工作得很好,直到我決定其中一個DLL應該是一個EXE。C++/CLI:使用LoadLibrary + GetProcAddress和exe
LoadLibrary's documentation說它也可以用於exe的,所以我給它一個鏡頭。該exe被加載沒有錯誤,作爲GetProcAddress。但是,當我嘗試調用具體對象的構造函數時,出現訪問衝突。
我認爲這會發生,因爲加載一個exe不會加載它使用的所有dll。所以我嘗試使用LoadLibrary加載它們,但我得到了同樣的錯誤。 對此有何建議?
這裏是我的代碼(混合C++/CLI):
Interface* MCFactory::LoadInstanceFromAssembly(String^concreteAssemblyName, String^param){
string fullPathToAssembly = "";
fullPathToAssembly += FileSystem::GetPathToProgramDirectory();
fullPathToAssembly += "\\" + marshal_as<string>(concreteAssemblyName);
MODULE hDLL = AssemblyLoader::GetInstance().LoadAssembly(fullPathToAssembly);
Interface* pObject = NULL;
if (hDLL != NULL){
t_pCreateInstanceFunction pCreateInstanceFunction =
(t_pCreateInstanceFunction) ::GetProcAddress (hDLL, CREATE_INSTANCE_FUNCTION_NAME.c_str());
if (pCreateInstanceFunction != NULL){
//Yes, this assembly exposes the function we need
//Invoke the function to create the object
pObject = (*pCreateInstanceFunction)(marshal_as<string>(param));
}
}
return pObject;
}
(AssemblyLoader ::的GetInstance()LoadAssembly僅僅是::調用LoadLibrary的包裝。)
當然,這種方法需要對EXE進行一些非常有創意的更改。它可能適用於特定情況,但不適用於一般情況。 – 2015-11-15 19:23:08
我在那篇文章中所說的一切都沒有記錄。因此,只要條件保持不變(即現有的重新配置,CRT稱爲IAT修補),它就會工作。 – Michael 2015-11-15 20:06:01
咦?你正在使用的每一個技巧都是做出無證的假設。向我展示一個官方的微軟文檔,說可以在第二個模塊中調用WinMainCRTStartup'(重要的觀察:每次'WinMainCRTStartup'調用'GetModuleHandle(0)'時,它都沒有得到它正在初始化的模塊的句柄,而是流程的主要模塊,包括清單在內的所有資源都不會被正確找到。)這僅僅是一個開始。 – 2015-11-15 20:34:59