.X文件解析 - 调用创建枚举对象失败

时间:2012-01-30 19:13:11

标签: winapi parsing memory-management directx enumeration

我正在为DirectX编写一个.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文件进行枚举时,这种差异是否会导致问题?

1 个答案:

答案 0 :(得分:0)

如果这是默认的tiny.x模型,我只是看到它在枚举时因意外指定无效路径而失败。我在枚举之前添加了文件路径检查(我使用了boost :: filesystem :: exists(path))。

我建议添加这样的检查,因为上面的代码示例没有这样的显式检查,因此您的模型可能具有无效的名称,因此错误可能会产生误导。