Я написал C ++ Dll, которая имеет две функции: одна записывает двоичный файл на диск, а другая читает этот файл с диска и загружает в память.
//extremely simplified code looks like this
bool Utilities::WriteToBinary(wstring const fileName)
{
//lot of code
DWORD size = //get size of data to write
LPBYTE * blob = new LPBYTE[size];
WriteDataToMemoryBlob(blob, & size);
FILE * pFile;
if(0 != _wfopen_s (&pFile , fileName.c_str() , L"wb" ))
{
//do something
return false;
}
fwrite (blob, 1, size , pFile );
fclose (pFile);
delete[] blob;
return true;
}
bool Utilities::ReadDataFromDisk(wstring const fileName)
{
long fileSize = GetFileSize(fileName);
FILE * filePointer;
if(0 != _wfopen_s (&filePointer, fileName.c_str() , L"rb" ))
return false;
//read from file
LPBYTE * blobRead = new LPBYTE[fileSize];
fread (blobRead, 1, fileSize , filePointer );
fclose (filePointer);
//rest of the code...
проблема
Я создал еще один проект C ++, который вызывает эти методы DLL для тестирования.
Проблема, которая сводит меня с ума в том, что когда я звоню WriteToBinary а также ReadDataFromDisk последовательно внутри одной и той же программы они работают отлично. Но когда я звоню WriteToBinary и пусть программа выйдет и вызовет ReadDataFromDisk в следующий раз и укажите путь к файлу, написанному ранее WriteToBinary, Я получаю BadPtr в blobRead после выполнения Fread.
Я старался изо всех сил, чтобы убедиться, что нет общих или статических структур данных. Оба метода полностью независимы.
Есть идеи, что может быть причиной этого?
Ошибка заключается в выделении массива как LPBYTE
это BYTE*
Итак:
LPBYTE * blobRead = new LPBYTE[fileSize];
Распределяет массив BYTE*
, а не массив BYTE
, Изменить на:
BYTE* blobRead = new BYTE[fileSize];
Чтобы избежать динамического выделения, вы можете использовать std::vector<BYTE>
вместо:
std::vector<BYTE> blobRead(fileSize);
Других решений пока нет …