Fread дает BadPtr, когда сделано в новом процессе

Я написал 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.

Я старался изо всех сил, чтобы убедиться, что нет общих или статических структур данных. Оба метода полностью независимы.

Есть идеи, что может быть причиной этого?

0

Решение

Ошибка заключается в выделении массива как LPBYTE это BYTE* Итак:

LPBYTE * blobRead = new LPBYTE[fileSize];

Распределяет массив BYTE*, а не массив BYTE, Изменить на:

BYTE* blobRead = new BYTE[fileSize];

Чтобы избежать динамического выделения, вы можете использовать std::vector<BYTE> вместо:

std::vector<BYTE> blobRead(fileSize);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]