C++ 从内存创建着色器时出错

C++ 从内存创建着色器时出错,c++,directx,shader,hlsl,C++,Directx,Shader,Hlsl,由于d3dcompiler*.dll变得不受欢迎,我试图从我的应用程序中排除对它的依赖关系。我新编译的着色器对象(.cso)文件加载代码有问题 ifstream fstream; fstream.open (vsfile); if(fstream.fail()) return false; fstream.seekg( 0, ios::end ); size_t size = size_t(fstream.tellg()); char* data = new char[si

由于
d3dcompiler*.dll
变得不受欢迎,我试图从我的应用程序中排除对它的依赖关系。我新编译的着色器对象(.cso)文件加载代码有问题

ifstream fstream;  
fstream.open (vsfile);
if(fstream.fail())
    return false;

fstream.seekg( 0, ios::end );  
size_t size = size_t(fstream.tellg());  
char* data = new char[size];

fstream.seekg(0, ios::beg);  
fstream.read( data, size);  
fstream.close();  

XTRACE2(pDevice->CreateVertexShader(&data, size, 0, &m_pVertexShader))
问题:
CreateVertexShader()
返回
E_INVALIDARG
错误

带有
D3DReadFileToBlob()
的旧代码可以正常工作。Blob返回与我的
char*
std::vector
大小相同的缓冲区,其大小等于
.cso
文件大小。 我知道,MSDN上有新的Windows8示例,但它们使用了一些新的Metro内容。我想用普通的C++来做。
XTRACE2
只是DirectX错误检查宏


提前谢谢

错误是在文本模式下读取二进制文件引起的。如果在读取函数中添加二进制标志,则可以正常工作。诸如此类:

            std::ifstream fstream;  
            fstream.open (filename,  std::ifstream::in | std::ifstream::binary);
            if(fstream.fail())
                return false;

            fstream.seekg( 0, std::ios::end );  
            size_t size = size_t(fstream.tellg());  
            data.resize(size);  
            fstream.seekg(0, std::ios::beg);  
            fstream.read( &data[0], size);  
            fstream.close(); 

羞耻于我=\

数据是编译后的着色器吗?否则,您必须先编译它。是的,它是由VS2012创建的已编译着色器对象(AFAIK它使用fxc.exe)。