今天在代碼機上寫shader的時候,D3DXCreateEffectFromFile已經成功了,但是程序一旦執行到pEffect->SetTechnique("TechName")時就彈出一個運行時錯誤,錯誤內容如下:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
糾結了半天,沒有找到什麼原因,首先肯定Shader代碼是沒問題的,一開始以爲是因爲忽略了libcp.lib(編譯器是VS2010)導致的,結果不然。
後來通過反彙編,查看SetTechnique中的函數調用,通過函數地址反查到了函數的名稱,結果這個函數並不是SetTechnique中正確的函數版本,
這樣一來就知道了原來是引用的dx lib文件不對。。
最後終於明白了,我的代碼機裝了好幾個版本的DX SDK,包含的頭文件的順序和引用的lib的順序不同,導致了同文件和lib庫不匹配,因此出現了這個錯誤。
解決辦法是:
在項目屬性中的VC++目錄選項中將包含目錄和庫目錄中的引用的DX頭文件目錄和DX庫目錄的次序調整一致即可。。。
ps: 以上解決辦法只適用於vs2008 vs2010, vs2005用戶請在工具->選項->VC++目錄中設置。
總結:
在進行3D開發時,要管理好自己的DX庫, 尤其是安裝了多個DX版本的時候,頭文件順序和庫文件順序一定要一致。 如果電腦上只安裝了一個DX版本基本不會有這種糾結的問題發生。。。