gpt4 book ai didi

c++ - MessageBox 在捕获异常时不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 12:24:52 24 4
gpt4 key购买 nike

嗯,我有 2 个问题,但我现在主要关心的是我的 catch 异常。这是代码...

int GXRenderManager::Ignite(HINSTANCE * hinst, int * nCmd, GXDEVICE DeviceType, int width, int height)
{
try
{
GXRenderManager::hinstance = hinst;
GXRenderManager::nCmdShow = nCmd;

GXRenderManager::height = height;
GXRenderManager::width = width;

InitWindows();

switch(DeviceType)
{
case DIRECTX:
GXRenderManager::renderDevice = new GXDX;
break;
case OPENGL:
GXRenderManager::renderDevice = new GXGL;
break;
default:
throw GXException(L"Error Finding Video Device");
}

Device()->StartUp(GXRenderManager::mainWindow ,width, height); //Error happens here
}
catch(GXVideoException &e)
{
MessageBox(0,e.pReason,L"GXVideoException",1);//Catch happens but no message box
return 0;
}
catch(GXWindowsException &e)
{
MessageBox(0,e.pReason,L"Windows Error",1);
return 0;
}
catch(GXException &e)
{
MessageBox(0,e.pReason,L"Error",1);
return 0;
}

return 1;
}

这里是错误发生的地方

void GXDX::StartUp(HWND* mainWindow,int w, int h)
{
width = w;
height = h;
this->mainWindow = mainWindow;

ID3D10Texture2D *backBufferSurface;

DXGI_SWAP_CHAIN_DESC swapChainDesc;
swapChainDesc.BufferCount = 2;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
swapChainDesc.BufferDesc.Width = width;
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.OutputWindow = *mainWindow;
swapChainDesc.Windowed = TRUE;

D3D10_DRIVER_TYPE driverType = D3D10_DRIVER_TYPE_HARDWARE;

HRESULT hr = D3D10CreateDeviceAndSwapChain(NULL,driverType,NULL,0,
D3D10_SDK_VERSION, &swapChainDesc,&swapChain,&dxDevice);

if(FAILED(hr))
throw GXVideoException(L"Problems retrieving directX device");
}

当我走过时。 D3D10CreateDeviceAndSwapChain 返回失败,因此触发 GXVideoException 错误。

然后它会捕获并返回到 GXRenderManager 类,如下所示。

catch(GXVideoException &e)
{
MessageBox(0,e.pReason,L"GXVideoException",1);
return 0;
}

此时,如果我将光标放在 &e 上,我会清楚地看到消息“检索 directX 设备时出现问题”。但是消息框不显示

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
if(GXRenderManager::Ignite(&hInstance, &nCmdShow,DIRECTX) != 1)
return 0;
//NEVER REACHES THE RUN METHOD BELOW YET THE MAIN WINDOW REMAINS OPEN
GXRenderManager::Run();

return 0;
}

我觉得奇怪的另一件事是我创建的窗口仍然显示但从未到达主循环。就像应用程序由于消息框而处于空闲状态,但是消息框没有显示...

我还想补充一点,静态成员 renderDevice 是一个接口(interface)数据类型。 GXDX当然是接口(interface)的一个实现类。

GXDX 类包含 GXException header ,因此它能够抛出这些异常,以便主 GXRenderManager 可以捕获它们。

[编辑]

我想补充的另一件事是,如果我删除 Show window 方法

ShowWindow(*GXRenderManager::mainWindow, *GXRenderManager::nCmdShow);

它有效。所以只要我的主应用程序窗口没有打开。我的消息框看起来像它预期的那样。

[编辑]

在修复部分问题的 dauphic 响应之前,我继续编辑我的代码。我的收获现在看起来像这样

catch(GXVideoException &e)
{
MessageBox(*GXRenderManager::mainWindow,e.pReason,L"GXVideoException",1);
return 0;
}

但是现在我的应用程序打开然后立即关闭而不显示该框。 mainWindow 是指向我的基本窗口的指针。所以我不得不取消引用指针。

[编辑]

windows指针有问题

最佳答案

如果存在对话框,应始终将句柄传递给 MessageBox,而不是 0。如果没有可用对话框,则只传递 MessageBox 0。

旁注,我不明白其中的确切原因,所以如果其他人可以提供见解,那就太好了。

也有可能您的消息框已附加到您的对话框,并且由于您的对话框未激活,消息框未显示。当它挂起时按 alt 可能会导致它显示。

关于c++ - MessageBox 在捕获异常时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3094758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com