Làm thế nào tôi có thể đảm bảo một dll không được giải phóng trong khi bất kỳ đối tượng nào tồn tại?C++: Vấn đề tải Dll
Vấn đề là khi tôi sử dụng trình quản lý bộ nhớ, tôi có thể xóa các đối tượng dll trước khi giải phóng dll, tuy nhiên với con trỏ thông minh, tôi không có quyền kiểm soát thứ tự bị hủy, nghĩa là dll có thể được giải phóng trước. khi cố gắng để giải phóng một trong những đối tượng khác:
FlPtr là một thats đơn giản lớp refrence đếm gọi AddRef và Thả khi cần thiết
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
tôi đã cố gắng làm cho tay cầm dll dỡ itsself, tức là chỉ dỡ bỏ sau khi tất cả đối tượng đã bị xóa. Công việc này bằng cách tạo một đối tượng mới IExampleDll mà dll thực hiện. Điều này giống như đối tượng ExampleDll từ trước nhưng sống trong dll thay vì exe và cũng được tính đếm. Mỗi đối tượng trong dll gia tăng này refrence trên contruction và deincrements nó về tiêu hủy. Điều này có nghĩa là số lượng refrence chỉ đạt đến số không khi exe đã phát hành refrences của nó và tất cả các đối tượng dlls đã bị phá hủy. Sau đó nó xóa selfself của nó gọi FreeLibrary (GetModuleHandle()) trong destructor của nó.
Tuy nhiên điều này treo tại FreeLibrary, im asuming vì thread vẫn còn trong mã dlls đang được bốc dỡ ...
Tôi đang ở một mất mát hiện nay như thế nào để đảm bảo dll chỉ bốc dỡ khi không có các đối tượng còn lại, ngoài việc quay lại để giải phóng dll một cách rõ ràng sau khi mọi thứ khác đáng lẽ phải bị xóa;
int main()
{
ExampleDll *dll = LoadDll("bin\\example.dll");
restOfProgram();
delete dll;
}
Phương pháp này trở nên khó khăn khi dll cần được tải/dỡ tải giữa chương trình, tức là nếu người dùng thay đổi từ d3d sang openGL trong tùy chọn.
Ok Tôi đã có một suy nghĩ, nếu các dlls Release() phương pháp trả lại một bool, sai nếu không có refrences còn lại, một đặc biệt DllPtr có thể gọi thư viện miễn phí nếu phát hành trả lại false –
Nhưng vẫn còn có vấn đề cuối cùng refrence bị xóa trong dll nếu DllPtr của bị xóa đầu tiên ... Làm thế nào tôi sẽ đi về thực hiện các phương pháp tiếp cận COM vì vậy tôi có thể tiếp tục thăm dò ý kiến các dll sau khi ngăn xếp và tĩnh (tức là globals) bị phá hủy vì chỉ sau đó là nó garunteed có không ref? –
Bạn sẽ cần một loại "sạch" đối tượng mà không phải là trong dll mà bạn đang bốc dỡ để dỡ thành công dll như vậy, đây là khoảng những gì ole32.dll không khi CoUnitialize được gọi là. – Ismael