2012-01-31 155 views
-1

我創建了一個隱藏窗口,我正在尋找指向IDXGISwapChain::Present()的指針。問題是我無法獲得有效的Direct3D10設備,也無法獲得有效的交換鏈。D3D10CreateDeviceAndSwapChain()總是失敗,DXGI_ERROR_INVALID_CALL

HWND hwnd = CreateWindow(TEXT("flhiSTATIC"), TEXT("flh DXGI Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, NULL, NULL, 0); 
DXGI_SWAP_CHAIN_DESC scd; 
ZeroMemory(&scd, sizeof(scd)); 

scd.BufferCount = 2; 
RECT rcWnd; 
GetClientRect(hwnd, &rcWnd); 

scd.BufferDesc.Width = rcWnd.right - rcWnd.left; 
scd.BufferDesc.Height = rcWnd.bottom - rcWnd.top; 
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // also tried DXGI_FORMAT_R8G8B8A8_UNORM_SRGB 
scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; 
scd.BufferDesc.Scaling = DXGI_MODE_SCALING_CENTERED; 
scd.BufferDesc.RefreshRate.Numerator = 60; 
scd.BufferDesc.RefreshRate.Denominator = 1; 
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 
scd.OutputWindow = hwnd; 
scd.SampleDesc.Count = 1; 
scd.SampleDesc.Quality = 0; 
scd.Windowed = TRUE; 
scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; 

pD3D10CreateDeviceAndSwapChain = reinterpret_cast<D3D10CREATEDEVICEANDSWAPCHAIN_PROC *>(GetProcAddress(d3d10, "D3D10CreateDeviceAndSwapChain")); 

HRESULT hr = pD3D10CreateDeviceAndSwapChain(NULL /*pAdapter*/, D3D10_DRIVER_TYPE_HARDWARE, NULL, D3D10_CREATE_DEVICE_DEBUG, D3D10_SDK_VERSION, &scd, &pSwapChain, &pDev); 
// this guy always fails with 0 in both pSwapChain and pDev... 

任何想法上述代碼可能是錯誤的?

+0

我認爲問題是我沒有註冊一個窗口類。我目前正在調查這個問題。 – foxx1337 2012-01-31 14:41:35

+0

你應該驗證''CreateWindow''返回一個非零值。 – 2015-08-21 18:24:16

回答

-1

我完全忘了需要:(

這是問題創建或指定一個預先存在的窗口類;教訓 - 總是檢查所有調用的返回碼

編輯

我徹底忘了打電話給CreateWindow有效窗口類,這是由有人內註冊的任何一個我以前註冊或一個當前模塊。

+0

你如何「分配預先存在的窗口類」?你能否讓你的答案更清楚? – 2012-04-09 17:01:41

+0

@samhocevar - 我沒有粘貼窗口類「flhiSTATIC」註冊的地方,不是因爲簡潔,而僅僅是因爲我從來沒有註冊過這樣的窗口類;所以'CreateWindow'調用失敗。它應該接收一個有效的類,以便成功,無論是我自己創建的,還是通過不同的方式從代碼的其他部分「釣魚」的(我粘貼的這個代碼實際上被注入到另一個進程中)。 – foxx1337 2018-03-02 15:46:53