MessageBox не работает в подвохе исключения - PullRequest
1 голос
/ 22 июня 2010

Ну, у меня есть 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, поэтому он может генерировать эти исключения, чтобы основной GXRenderManager мог их перехватить.

[EDIT] * * тысячу двадцать-один

Еще одна вещь, которую я хотел бы добавить, если я уберу метод Показать окно

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

Это работает. Так что пока главное окно моего приложения не открыто. Мое окно сообщения выглядит так, как и предполагалось.

[EDIT]

Перед тем, как решить проблему, я решил продолжить и отредактировал свой код. Мой улов теперь выглядит так

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

Но теперь мое приложение открывается, а затем сразу же закрывается без отображения окна. mainWindow - указатель на мое базовое окно. Поэтому мне пришлось разыменовать указатель.

[EDIT]

Указатель Windows плохой

1 Ответ

1 голос
/ 22 июня 2010

Если имеется диалоговое окно, MessageBox всегда должен передавать ему дескриптор, а не 0. Передайте MessageBox 0, если диалоговое окно недоступно.

Примечание: я не понимаю точной причины этого, поэтому было бы здорово, если бы кто-то еще мог дать понимание.

Также возможно, что ваше окно сообщений прикреплено к вашему диалогу, и, поскольку ваш диалог не активен, окно сообщения не отображается. Нажатие alt во время зависания может привести к его отображению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...