如何確保dll在其中存在任何對象時不被卸載?C++:Dll卸載問題
問題是,當我使用顯式內存管理時,我可以在釋放dll之前刪除dll對象,但是使用智能指針我無法控制那裏銷燬的順序,這意味着dll可能首先被釋放導致崩潰設法釋放其他對象之一時:
FlPtr是一個簡單的refrence計數類這就是調用的AddRef,並根據需要
ExampleDll *dll = LoadDll(L"bin\\example.dll");
IObject *obj = dll->CreateObject();
...
obj->Release();
delete dll;//fine because all objects already deleted
return 0;
auto_ptr<ExampleDll> dll = LoadDll(L"bin\\example.dll");
FlPtr<IObject> obj = dll->CreateObject();
...
return 0;//crash if dll is destructed before obj since Object::Release needs to call into the dll
我試圖使該dll手柄卸載itsself釋放,即所有對象後只卸載已被刪除。這項工作是通過創建一個DLL實現的新對象IExampleDll。這與之前的ExampleDll對象相似,但是它們位於dll而不是exe中,並且也被計算在內。 dll中的每個對象都增加了這個構造參考,並在銷燬時將其刪除。這意味着當exe已經釋放它的引用並且所有的dll對象都被銷燬時引用計數只會達到零。然後刪除自己在其析構函數中調用FreeLibrary(GetModuleHandle())。
然而,這在FreeLibrary則,IM asuming崩潰,因爲線程仍然在被卸載這些DLL的代碼...
我不知所措我現在如何確保該dll只卸載時除了在刪除其他所有內容之後明確釋放dll外,沒有其他對象。當DLL文件需要被saftly加載/卸載程序中旬,也就是說,如果從D3D改變了用戶在選擇的OpenGL
int main()
{
ExampleDll *dll = LoadDll("bin\\example.dll");
restOfProgram();
delete dll;
}
這種方法變得困難。
我不想終止線程,只是釋放DLL並返回到EXE /以前的DLL – 2009-01-20 15:06:46
這沒有任何意義 - 你只是卸載所有的返回語句! – MSalters 2009-01-23 08:29:01