hikaru05 |
2010-04-05 11:46 PM |
VS2005無法偵錯...vista
對於VS2005裝在vista上,小弟找了不少資訊
也有看到版內類似的帖~ http://forum.slime.com.tw/thread209717.html
但多是告知安裝
MicrosoftR Visual StudioR 2005 Team Suite Service Pack 1
再裝
Visual Studio 2005 Service Pack 1 Update for Windows Vista
可這兩個版本載後要安裝卻都出現:
「Windows Installer服務無法安裝升級修補程式,因為待升級的程式已遺失,或者升級修補程式已經更新到不同版本。請確認您要升級的程式已經存在您的電腦上,而且您擁有正確的升級補修程式。」
我使用的版本是Visual C++2005 Express Edition
並有安裝DirectX9
可開啟檔案要執行偵錯時卻都偵錯不能...(此檔案是在課堂上能正常執行的)
時常出現
「fatal error C1083: 無法開啟包含檔案: 'testd3d.h': No such file or directory」
「LINK : fatal error LNK1104: 無法開啟檔案 'winmm.lib'」
「無法啟動程式'c:\User\Desktop\100319\程式專案\Debug\testd3d.exe' 系統找不到指定的檔案。」
「LINK : 最後的累加連結找不到或未建置 Debug/testd3d.exe,正在執行完整連結」
有試過將指令貼在VS2008上來作業,但可能裡面語法有些不同所以也偵錯無法
因為老師教學指定使用VS2005,且小弟是C++的新手...
麻煩各位高手們幫忙解答了!!謝謝。
*以下是執行偵錯的testd3d.cpp
語法:
// testd3d.cpp : 定義應用程式的進入點。
//
#include "stdafx.h"
#include <d3dx9.h>
#include <mmsystem.h>
#include "testd3d.h"
const int W=640;
const int H=640;
IDirect3DVertexBuffer9* Cube=0;
IDirect3DIndexBuffer9* CubeIdx=0;
IDirect3DDevice9* d3dDevice = NULL;
// 這個程式碼模組中所包含之函式的向前宣告:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int EnterMsgLoop( bool (*ptr_display)(float timeDelta) );
//
// Framework Functions
//
struct Vertex
{
Vertex(float x,float y,float z)
{ _x=x,_y=y,_z=z;}
float _x,_y,_z;
static const DWORD FVF;
};
const DWORD Vertex::FVF=D3DFVF_XYZ;
bool Setup()
{
d3dDevice->CreateVertexBuffer(8*sizeof(Vertex),D3DUSAGE_WRITEONLY,
Vertex::FVF,D3DPOOL_MANAGED,&Cube,0);
d3dDevice->CreateIndexBuffer(36*sizeof(WORD),D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,D3DPOOL_MANAGED,&CubeIdx,0);
Vertex* p;
Cube->Lock(0,0,(void**)&p,0);
p[0]=Vertex(-1.0f,1.0f,3.0f);
p[1]=Vertex(0.0f,1.0f,2.0f);
p[2]=Vertex(0.0f,-1.0f,2.0f);
p[3]=Vertex(-1.0f,-1.0f,3.0f);
p[4]=Vertex(1.0f,1.0f,3.0f);
p[5]=Vertex(0.0f,1.0f,4.0f);
p[6]=Vertex(0.0f,-1.0f,4.0f);
p[7]=Vertex(1.0f,-1.0f,3.0f);
Cube->Unlock();
WORD* pw=0;
CubeIdx->Lock(0,0,(void**)&pw,0);
pw[0]=2;pw[1]=3;pw[2]=0;
pw[3]=1;pw[4]=2;pw[5]=0;
pw[6]=7;pw[7]=4;pw[8]=6;
pw[9]=4;pw[10]=5;pw[11]=6;
pw[12]=1;pw[13]=4;pw[14]=2;
pw[15]=7;pw[16]=2;pw[17]=4;
pw[18]=0;pw[19]=5;pw[20]=1;
pw[21]=4;pw[22]=1;pw[23]=5;
pw[24]=7;pw[25]=6;pw[26]=2;
pw[27]=3;pw[28]=2;pw[29]=6;
pw[30]=0;pw[31]=3;pw[32]=5;
pw[33]=6;pw[34]=5;pw[35]=3;
CubeIdx->Unlock();
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,D3DX_PI*0.5f,W/H,1.0f,1000.0f); //把矩陣給他
d3dDevice->SetTransform(D3DTS_PROJECTION,&proj);
d3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
return true;
}
void Cleanup()
{
Cube->Release();
Cube=0;
CubeIdx->Release();
CubeIdx=0;
}
bool Display(float timeDelta)
{
if(d3dDevice)
{
//設定相關變數
static float xDist=5.0f,zDist=5.0f,xMoveDir=1.0f,zRot=0.0f;
//建立相關變數
D3DXMATRIX matTran;
xDist -= xMoveDir*timeDelta;
if(xDist <= -5.0f||xDist >= 5.0f)
xMoveDir*=-1.0f;
D3DXMatrixTranslation(&matTran,xDist,0.0f,5.0f);
d3dDevice->SetTransform(D3DTS_WORLD,&matTran);
//建立旋轉矩陣
D3DXMATRIX matRotZ;
zRot+=timeDelta;
if(zRot>=D3DX_PI*2.0f)
zRot=0.0f;
D3DXMatrixRotationZ(&matRotZ,zRot);
D3DXMATRIX matWorld=matRotZ*matTran;
d3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
d3dDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0xfffffffffff,1.0f,0);
d3dDevice->BeginScene();
d3dDevice->SetStreamSource(0,Cube,0,sizeof(Vertex));
d3dDevice->SetIndices(CubeIdx);
d3dDevice->SetFVF(Vertex::FVF);
d3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);
d3dDevice->EndScene();
d3dDevice->Present(0,0,0,0);
}
return true;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// Create the main window.
WNDCLASS wc;
int iWidth = 640,
iHeight = 480;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = "Direct3D9App";
if( !RegisterClass(&wc) )
{
MessageBox(0, "RegisterClass() - FAILED", 0, 0);
return false;
}
HWND hwnd = 0;
hwnd = CreateWindow("Direct3D9App", "Direct3D9App",
WS_EX_TOPMOST,
0, 0, iWidth, iHeight,
0 , 0, hInstance, 0);
if( !hwnd )
{
MessageBox(0, "CreateWindow() - FAILED", 0, 0);
return false;
}
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
// 測試Direct3D.
// Step 1: Create the IDirect3D9 object.
IDirect3D9* d3d9 = NULL;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if( !d3d9 )
{
::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
return false;
}
// Step 2: Check for hardware vp.
D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, // 使用繪圖卡,而非軟體模擬
&caps);
int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
// Step 3: Fill out the D3DPRESENT_PARAMETERS structure.
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = iWidth;
d3dpp.BackBufferHeight = iHeight;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true; // 使用視窗模式
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Step 4: Create the device.
HRESULT hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
D3DDEVTYPE_HAL, // device type
hwnd, // window associated with device
vp, // vertex processing
&d3dpp, // present parameters
&d3dDevice); // return created device
if( FAILED(hr) )
{
d3d9->Release(); // done with d3d9 object
MessageBox(0, "CreateDevice() - FAILED", 0, 0);
return false;
}
d3d9->Release(); // done with d3d9 object
if(!Setup())
{
MessageBox(0, "Setup() - FAILED", 0, 0);
return 0;
}
EnterMsgLoop( Display );
Cleanup();
d3dDevice->Release();
return 0;
}
//
// 函式: WndProc(HWND, unsigned, WORD, LONG)
//
// 用途: 處理主視窗的訊息。
//
// WM_COMMAND - 處理應用程式功能表
// WM_PAINT - 繪製主視窗
// WM_DESTROY - 傳送結束訊息然後返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int EnterMsgLoop( bool (*ptr_display)(float timeDelta) )
{
MSG msg;
::ZeroMemory(&msg, sizeof(MSG));
static float lastTime = (float)timeGetTime();
while(msg.message != WM_QUIT)
{
if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
float currTime = (float)timeGetTime();
float timeDelta = (currTime - lastTime)*0.001f;
ptr_display(timeDelta);
lastTime = currTime;
}
}
return msg.wParam;
}
|