2016-03-07 32 views
-1

我一直試圖進入DirectX編程(使用C++/Win32),並且遇到一些問題。DirectX創建*方法_com_error異常

一位朋友編寫了一個非常簡單的隨機地形生成器,與Perlin Noise搭配使用,所以我試圖抓住他的代碼併爲它製作一個DirectX 11渲染器,但是我的程序在運行時會拋出「Microsoft C++異常」_com_error它。

即使wierder,在不同線路的依賴於構建類型代碼程序中斷...

上進行調試,在此塊的代碼的程序中斷:

// Load the pixel shader 
std::ifstream pixelFile("pixel.cso"); 
if (!pixelFile) 
    return false; 
std::string pixelContents((std::istreambuf_iterator<char>(pixelFile)), 
    std::istreambuf_iterator<char>()); 
pixelFile.close(); 
if (FAILED(mpDevice->CreatePixelShader(pixelContents.c_str(), 
    pixelContents.size(), 
    NULL, 
    &mpPixelShader))) 
    return false; 

而且上發佈:

// Create and set the input layout 
if (FAILED(mpDevice->CreateInputLayout(layoutDescription, 
    layoutDescriptionSize, 
    vertexContents.c_str(), 
    vertexContents.length(), 
    &mpVertexLayout))) 
    return false; 

mpPixelShader是類型ID3D11PixelShader *的成員,並且是mpVertexLayout類型ID3D11InputLayout的成員*。

當然,當我看到錯誤是不同的時候,我首先想到的是檢查內存損壞情況,當然,在運行ApplicationVerifier並設置_crtDbgFlag後,我在朋友的代碼中發現了一個,但現在已經修復並且我仍然有這個錯誤...

當渲染初始化函數填充了MSDN Win32 DirectX三角形教程中的修改版本時,應用程序運行良好。

回答

0

cso文件不是文本,它是一個二進制文件。 A std::string將不起作用,該文件將包含爲0的字節。

+0

在這些情況下,'std :: string'實際上起作用。由於數據是連續的(至少在GNU和MSVC實現上),所以它不使用C風格的'strlen'來計算長度,'c_str'就像'&string [0]'一樣工作。無論如何,我仍然遵循你的建議,並使用一個std ::向量,它仍然會產生相同的錯誤,所以問題不是來自這裏。 – blue