正确使用shared_ptr进行显式库链接

时间:2014-12-04 22:07:17

标签: c++11 shared-ptr

我正在使用http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLLhttp://eli.thegreenplace.net/2011/09/16/exporting-c-classes-from-a-dll/(以及其他一些博客,帖子等,但我的声誉太低,无法发布)尝试创建一个类库我可以明确链接到。我想做的是使用std :: shared_ptr在终止时处理类的基本删除(或者它超出范围)。我的代码编译,但在运行时它不断在xrefwrap中获得访问冲突。这是我的单元测试代码:

typedef IHermes* (*pHermesFactory)();
typedef std::shared_ptr<IHermes> IHermesPtr;

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    int iReturnValue = 0;
    HINSTANCE hInstance = LoadLibrary(TEXT("Hermes.dll"));
    assert(hInstance);
    pHermesFactory pHermes = (pHermesFactory)GetProcAddress(hInstance, "HermesFactory");
    assert(pHermes);
    IHermesPtr ptrHermes(pHermes(), std::mem_fn(&IHermes::Release));
    assert(ptrHermes);

FINISH:
    if (hInstance)
        FreeLibrary(hInstance);<br/>
    return iReturnValue;
}

我已阅读了shared_ptrmem_fn的MSDN说明,并对此网站和其他网站进行了更多研究,但我无法弄清楚我做了些什么C ++不喜欢。

IHermes是一个标准接口:struct IHermes{ virtual void Release()=0;};(此时就是那里唯一的函数)

我已经在Factory返回的类中实现了Release:

 class Hermes : public IHermes { void Release() { delete this; } }

最后工厂功能是:

 (extern "c" - declared in header not in the implementation) __cdecl(dllexport) IHermes* APIENTRY HermesFactory(){ return new Hermes; }

这是违反(从xrefwrap)访问此内容的地方:

template<class _Pmf,
   class _Farg0,
   class... _Ftypes>
static _Ret _Call_pmf(_Pmf _Pm, _Farg0&& _Fx0, false_type, _Ftypes&&... _Fargs)
{   // apply to (possibly smart) pointer
   return (((*_Fx0).*_Pm)(_STD forward<_Ftypes>(_Fargs)...)); <-- ACCESS VIOLATION??
}

有没有人有任何想法,我已经搞砸了,或者我可以去哪里做更多的研究并弄清楚这一点?任何帮助将不胜感激。

0 个答案:

没有答案