我正在使用http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL和http://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_ptr
和mem_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??
}
有没有人有任何想法,我已经搞砸了,或者我可以去哪里做更多的研究并弄清楚这一点?任何帮助将不胜感激。