Здравствуйте, beldmit, Вы писали:
B>Не очень понимаю. Чем это отличается от обычной передачи указателя в функцию dll для модификации? Я скорее поверю в какую-то ошибку в конструкторе CVisit, из-за чего в память пишется фигня. На этом форуме я нашел похожую проблему — тогда симптомы ошибки исчезали после убирания virtual из описания деструктора, а сама ошибка была следствием выхода где-то за пределы массива. Код живет дома, вечером проверю.
B>Если Вы правы, то что с этим предполагается делать? В принципе этот плагин я могу счесть частью основной функциональности и не совать в dll, но нет ли более правильного способа?
не обращаться к массивам непосредственно
template <class TYPE, class ARG_TYPE = const TYPE&>
class CArrayV
{
public:
virtual int Add(ARG_TYPE v)
{
array.Add(v)
}
virtual int RemoveAll()
{
m_array.RemoveAll();
}
protected:
CArray<TYPE, ARG_TYPE> m_array;
};
template <class TYPE, class ARG_TYPE = const TYPE&>
class CArrayEx
{
public:
int Add(ARG_TYPE v)
{
array.Add(v)
}
int RemoveAll()
{
m_array.RemoveAll();
}
protected:
CArray<TYPE, ARG_TYPE> m_array;
};
// EXE
CArrayV <int, int> arrayV;
CArrayEx <int, int> arrayEx;
MyDllFunctionEX(&arrayEx);
MyDllFunctionV(&arrayV);
arrayEx.RemoveAll(); // Здесь будет бабах
arrayV.RemoveAll(); // OK
// DLL
void MyDllFunctionEX(CArrayEx<int, int> *array)
{
array->Add(128);
array->Add(256);
}
void MyDllFunctionV(CArrayEx<int, int> *array)
{
array->Add(128);
array->Add(256);
}