2012-01-30 93 views
0

我正在爲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文件進行枚舉時,這種差異會導致問題嗎?

回答

0

如果這是默認的tiny.x模型,我只看到它通過無意指定一個無效路徑而在枚舉上失敗。我在枚舉之前添加了文件路徑檢查(我使用了boost :: filesystem :: exists(path))。

我建議添加這樣的檢查,因爲上面的代碼示例沒有這樣的顯式檢查,所以您的模型可能會有一個無效的名稱,因此錯誤可能會出現誤導。

+0

我正確解析了文件名,它與程序位於同一目錄(和tiger.x相同的目錄)...我試圖使用CreateFile和ReadFile將文件讀入內存中...我會編輯上面的代碼以顯示發生了什麼... fileBuffer沒有從ReadFile函數獲取數據... – 2012-01-30 19:45:10