相关疑难解决方法(0)

C++:Dll卸载问题

如何确保dll在其中存在任何对象时不会被卸载?

问题是,当我使用explict内存管理时,我可以在释放dll之前删除dll对象,但是使用智能指针我无法控制它们被破坏的顺序,这意味着dll可能会在尝试释放时首先释放导致崩溃其他一个对象:

FlPtr是一个简单的引用计数类,可根据需要调用AddRef和Release

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
Run Code Online (Sandbox Code Playgroud)

我试着让dll句柄自己卸载,即只删除所有对象后卸载.这项工作是通过创建一个dll实现的新对象IExampleDll.这就像之前的ExampleDll对象一样,但它位于dll而不是exe中,并且也是refrence计数的.dll中的每个对象都会增加对构造的依赖,并在破坏时将其减去.这意味着当exe释放它的引用并且所有dll对象都被破坏时,引用计数才会达到零.然后删除它自己在析构函数中调用FreeLibrary(GetModuleHandle()).

然而,这在FreeLibrary中崩溃了,因为线程仍然在正在卸载的dlls代码中...

我现在不知道如何确保只在没有剩余对象的情况下卸载dll,除了在其他所有内容都应该删除之后再显示释放dll;

int main()
{
    ExampleDll *dll = LoadDll("bin\\example.dll");
    restOfProgram();
    delete dll;
}
Run Code Online (Sandbox Code Playgroud)

当需要在程序中间加载/卸载dll时,即当用户在选项中从d3d更改为openGL时,这种方法变得困难.

c++ dll

5
推荐指数
1
解决办法
2万
查看次数

我怎么能不将函数(std :: bind)包装到命名空间中?

我想将绑定类模板包装到一个单独的命名空间:

namespace my_space {
template<typename... R> using bind = std::bind<R...>;
}
Run Code Online (Sandbox Code Playgroud)

并得到一个错误:

error: 'bind<R ...>' in namespace 'std' does not name a type.
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?这里可以找到一个小例子.

c++ bind wrapper

4
推荐指数
1
解决办法
162
查看次数

标签 统计

c++ ×2

bind ×1

dll ×1

wrapper ×1