我已经在VS 2010中编译并构建了一个DLL项目。我在同一个解决方案中添加了一个姐妹项目,它实际上将链接到上面的DLL并需要加载它的构造函数和功能。但是,一旦我尝试实例化对象,它就会提供access violation
。
主要是,我这样做..
#include <iostream>
#include "MCaromDLL.h"
using namespace std;
using namespace MagneticCarom;
int main() {
. . .
MagneticCaromWrapper wrapper;
. . .
}
我的“MCaromDLL.h”看起来像这样:
// MCaromDLL.h
#define NULL 0
#define MAX_COLS 201 //Fixed based on the FEMM values
#define MAX_ROWS MAX_COLS //Fixed based on the FEMM values
#ifdef DLL_PROJECT
#define DLLSPEC __declspec(dllexport)
#else
#define DLLSPEC __declspec(dllimport)
#endif
#ifndef __MCAROMDLL_H__
#define __MCAROMDLL_H__
namespace MagneticCarom
{
. . . . . . .
class DLLSPEC MagneticCaromWrapper
{
private:
//All private members here...
public:
MagneticCaromWrapper();
MagneticCaromWrapper(int number);
virtual ~MagneticCaromWrapper();
//remaining functions
}
}
#endif
请注意,我正在尝试导出整个类(虽然我现在也尝试导出单个func,但是徒劳无功)。整个代码可根据要求提供。
答案 0 :(得分:2)
通过dll接口处理内存或结构总是一个问题。 可能出错的事情:
确保它有效: - 使用纯虚拟界面 - 使用工厂方法 - 使用删除/释放方法
IMagneticCaromWrapper* DLLSPEC FactoryMagneticCaromWrapper();
class IMagneticCaromWrapper
{
public:
virtual void Release();
}
实施。
IMagneticCaromWrapper* DLLSPEC FactoryMagneticCaromWrapper()
{
return new MagneticCarom();
}
IMagneticCaromWrapper::Release()
{
delete this;
}
最好不要跨越dll边界抛出异常。