我正在爲DirectX編寫一個.X文件解析器類。當我嘗試解析大文件時,創建枚舉對象的調用失敗。.X文件解析 - 調用來創建枚舉對象失敗
我認爲這是由於文件的大小...當前類與更小的文件,如tiger.x(31 kb)。但是,當我嘗試加載一個較大的文件,如tiny.x(1500 KB)的調用創建枚舉對象失敗...這裏是從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文件進行枚舉時,這種差異會導致問題嗎?
我正確解析了文件名,它與程序位於同一目錄(和tiger.x相同的目錄)...我試圖使用CreateFile和ReadFile將文件讀入內存中...我會編輯上面的代碼以顯示發生了什麼... fileBuffer沒有從ReadFile函數獲取數據... – 2012-01-30 19:45:10