Я пишу класс анализатора файлов .X для DirectX. Когда я пытаюсь разобрать большие файлы, вызов для создания объекта перечисления завершается неудачей.
Я думаю, что это из-за размера файла ... текущий класс работает с меньшими файлами, такими как tiger.x (31 КБ). Однако, когда я пытаюсь загрузить больший файл, такой как tiny.x (1500 КБ), вызов для создания объекта перечисления завершается неудачно ... вот выдержка из CXParser.cpp:
#include "CXParser.h"
#include "d3dx9xof.h"
BOOL CXParser::Parse(char *filename, void** data)
{
LPD3DXFILE pDXFile = NULL;
LPD3DXFILEENUMOBJECT pEnum = NULL;
LPD3DXFILEDATA pDataObj = NULL;
SIZE_T nChildren = NULL;
DWORD Depth = 0;
int iFileLength=0;
HANDLE hFile=NULL;
DWORD dwBytesRead=0;
LPVOID fileBuffer = NULL;
hFile = CreateFileA (filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
iFileLength = GetFileSize (hFile, NULL);
fileBuffer = malloc (iFileLength + 2) ;
ReadFile(hFile, fileBuffer, iFileLength, &dwBytesRead, NULL);
BeginParse(data);
if(FAILED(D3DXFileCreate(&pDXFile)))
{
MessageBox(NULL, L"Could not Create DX File Interface Object", L"ERROR", MB_OK);
return false;
}
if(FAILED(pDXFile->CreateEnumObject((LPVOID)filename, DXFILELOAD_FROMFILE, &pEnum)))
{
MessageBox(NULL, L"Could not Create DX Enumeration Object", L"ERROR", MB_OK); pDXFile->Release();
return false; // function exits here when loading large .X files
}
if(FAILED(pEnum->GetChildren(&nChildren)))
{
MessageBox(NULL, L"Could not Enumerate .X File", L"ERROR", MB_OK);
return false;
}
for(SIZE_T index = 0; index < nChildren; index++)
{
if(SUCCEEDED(pEnum->GetChild(index, &pDataObj)))
{
if(!pDataObj->IsReference())
{
GetObjectName(pDataObj);
ParseObject(pDataObj, Depth, NULL);
pDataObj->Release();
}
}
}
EndParse(data);
pEnum->Release();
pDXFile->Release();
return TRUE;
}
Мой вопрос такой:
Можно ли загрузить файл .X в буфер памяти перед анализом?
Кроме того, я заметил, что tiger.x и tiny.x имеют разное количество битов, зарезервированных для значений с плавающей запятой (заголовки различаются):
Заголовок
tiger.x: xof 0302txt 0064
Заголовок
tiny.x: xof 0303txt 0032
Вызывает ли это различие проблему при загрузке файла .X для перечисления?