MessageBox不能捕获异常

时间:2010-06-22 15:46:39

标签: c++ visual-studio visual-c++

我有2个问题,但我现在主要担心的是我的捕获异常。这是代码......

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是一个接口数据类型。 GXDX当然是接口的实现类。

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

[编辑]

我想添加的另一件事是我删除了显示窗口方法

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

有效。所以只要我的主应用程序窗口没有打开。我的消息框显示为它的假设。

[编辑]

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

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

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

[编辑]

Windows指针不好

1 个答案:

答案 0 :(得分:1)

如果存在对话框,则应始终向MessageBox传递句柄,而不是0.如果没有可用的对话框,则仅传递MessageBox 0.

旁注,我不明白这个的确切原因,所以如果其他人可以提供见解会很棒。

您的消息框也可能被附加到对话框,并且由于您的对话框未处于活动状态,因此未显示消息框。挂起时按alt可能会导致显示。