Есть два проекта: DLL MFC для обозначения функционала и .NET'овский для чтения функционала библиотеки.
Почти все функции, определенные в библиотеке работают, кроме одной, которая считывает объекты из файла с помощью CArchive (данные объекты были предварительно записаны в файл, ошибок не возникло, метод сериализации определен, DECLATE/IMPLEMENT определен, пустой конструктор есть)
Объявления функции в C#[DllImport("testlib.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void ReadFromFile([MarshalAs(UnmanagedType.LPStr)] string path);
Реализация метода в C++, в котором вылетает исключениеstd::vector<Fruit*> plate; // Вектор, в котором будем хранить считанные объекты
//....
extern "C" _declspec(dllexport) void __stdcall ReadFromFile(char* path)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CFile file(CString(path), CFile::modeRead);
CArchive ar(&file, CArchive::load);
int n;
ar >> n;
for (int i = 0; i < n; i++)
{
Fruit* fruit;
ar >> fruit;
plate.push_back(fruit);
auto cstrName = fruit->name; // Для наглядности. Именно в этом моменте возникает исключение AccessVIolation
}
ar.Close();
file.Close();
}
Если нужен - метод записи файла с помощью CArchiveextern "C" _declspec(dllexport) void __stdcall WriteIntoFile(char* path)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CFile file(CString(path), CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file, CArchive::store);
ar << plate.size();
for (auto o : plate)
{
ar << o;
}
ar.Close();
file.Close();
}
На всякий случай реализация класса Fruit.cpp и заголовочный файл Fruit.h
Fruit.h
#ifndef FRUIT_H
#define FRUIT_H
#include "pch.h"
class Fruit : public CObject
{
DECLARE_SERIAL(Fruit);
public:
CString name;
Fruit();
Fruit(CString cname);
~Fruit();
virtual void Serialize(CArchive& ar);
};
#endif
Fruit.cpp
#include "pch.h"
#include "Fruit.h"
IMPLEMENT_SERIAL(Fruit, CObject, 1);
void Fruit::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar.IsStoring())
{
ar << name;
}
else
{
ar >> name;
}
}
Fruit::Fruit(CString cname)
{
name = cname;
}
Fruit::Fruit() {}
Fruit::~Fruit() {}
Я так понимаю, что не удается нормально записать объект, который получил CArchive в указатель Fruit*.
Подскажите, как это исправить.