C++ D3DX10CreateEffectFromFile返回E_在另一台计算机上失败

C++ D3DX10CreateEffectFromFile返回E_在另一台计算机上失败,c++,direct3d10,C++,Direct3d10,我有一个小应用程序,它加载一个模型并在没有照明或其他任何东西的情况下显示它。我一直在尝试构建一个发行版并在另一台计算机上运行它,但D3DX10CreateEffectFromFile不断返回E_FAIL 效果文件编译完美,在我的开发机器上运行完美,但在另一台电脑上却没有。电脑的规格没有那么大的不同。都是Windows7,都有GeForce图形卡。唯一真正的区别是,我试图运行该版本的计算机有一个与DirectX 11兼容的图形卡 包含我的发布版本的文件夹如下所示。。。 G:\ModelLoader

我有一个小应用程序,它加载一个模型并在没有照明或其他任何东西的情况下显示它。我一直在尝试构建一个发行版并在另一台计算机上运行它,但D3DX10CreateEffectFromFile不断返回E_FAIL

效果文件编译完美,在我的开发机器上运行完美,但在另一台电脑上却没有。电脑的规格没有那么大的不同。都是Windows7,都有GeForce图形卡。唯一真正的区别是,我试图运行该版本的计算机有一个与DirectX 11兼容的图形卡

包含我的发布版本的文件夹如下所示。。。 G:\ModelLoader d3dx10_43.dll

ModelViewer.exe

Simple.fx

test.txt(模型文件)

这在我的开发机器上运行得非常好(我已经注释掉了大部分代码,所以我所做的就是打开一个窗口,初始化D3D10并尝试加载一个效果)。在另一台电脑上,一切正常,直到

ID3D10Blob* l_pBlob_Errors = NULL;

HRESULT hr = D3DX10CreateEffectFromFile(L"Simple.fx", 
    NULL, 
    NULL, 
    "fx_4_0",
    //D3D10_SHADER_ENABLE_STRICTNESS || D3D10_SHADER_WARNINGS_ARE_ERRORS, 
    0,
    0, 
    pD3DDevice, 
    NULL, 
    NULL, 
    &modelObject->pEffect,
     &l_pBlob_Errors ,
     NULL); 

if (FAILED(hr))
{
       LPVOID l_pError = NULL;
    if( l_pBlob_Errors )
    {
          l_pError = l_pBlob_Errors->GetBufferPointer();
          char* myChar = (char*)l_pError;
          MessageBoxA(0, myChar, 0,0);
           }
else
{
     MessageBox(0,0,0,0);
        }
    return false;
 }
我认为着色器不包含任何错误,因为它在我的开发pc上正确编译

matrix Projection;

// PS_INPUT - input variables to the pixel shader
// This struct is created and fill in by the 
// vertex shader
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float4 Color : COLOR0;
};

PS_INPUT VS(float4 Pos : POSITION, float4 Color : COLOR)
{
PS_INPUT psInput;

// Pass through both the position and the color
psInput.Pos = mul( Pos, Projection );
psInput.Color = Color;

return psInput;
}

float4 PS(PS_INPUT psInput) : SV_Target
{
return psInput.Color;
}

// Define the technique
technique10 Render
{
pass P0
{
    SetVertexShader( CompileShader( vs_4_0, VS() ) );
    SetGeometryShader( NULL );
    SetPixelShader( CompileShader( ps_4_0, PS() ) );
}
}
L“simple.fx”也是正确的文件路径,因为我能够使用std::ifstream从中读取。我已经搜索了几个小时,没有找到答案,所有相关的问题都被证明是Effect文件中的一个错误,它在我的开发机器上编译

当我将错误添加到效果文件并在我的开发人员机器上运行它时,错误显示在messagebox中。当我在另一台电脑上运行相同的错误代码时,不会打印错误,并且l_pBlob_Errors==0


这可能是一件非常简单的事情,但我就是不明白发生了什么。任何帮助都将不胜感激

您问题的根本原因是您同时依赖d3dx10_43.dll和d3dcompile_43.dll。D3DX10开始使用D3DCompile,而不是DirectX SDK(2007年4月)版本中的HLSL编译器的另一个副本。看看这个和这个

还请记住,许可证不允许您仅将D3DX10*.DLL或D3DCompiler#43与应用程序并排复制。您必须使用传统的DirectSetup REDIST。您还应该使用DirectX SDK(2010年6月)附带的而不是


当然,更好的解决方案是删除Direct3D 10,移动到Direct3D 11,并避免使用完全。。。另外,许可证允许您只需将D3DCompile#46或#47与应用程序一起复制。

就是这样,我只需安装directx redist