[英]How do I `std::bind` a non-static class member to a Win32 callback function `WNDPROC`?
[英]How to catch an exception for a static object defined in a WndProc() function?
如何在下面的偽代碼中捕獲靜態對象a
拋出的異常,其中WndProc()
是Win32 API中的標准消息處理函數?
class A
{
public:
class Exception{};
A() throw(Exception) { ... }
};
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
static A a;
switch( message )
{
case WM_CREATE:
...
break;
...
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
非POD結構的函數級靜態在第一次調用函數時初始化,您可以在try and catch
包裝代碼塊try and catch
並捕獲異常,就像任何正常情況一樣
你需要在WndProc中捕獲它,因為你不應該讓C ++異常“從WndProc”傳播出去。 (這適用於所有Windows回調)
如果WndProc代碼不在“你的控制之下”,你可以提供一個包裝WndProc。
您需要實現報告機制以便以后處理,例如
LRESULT CALLBACK WndProcNoX(....)
{
try
{
static A a;
...
}
catch(Exception const & x)
{
// What do you want to happen?
// e.g.: add x to a log, or a list of "unhandled" exceptions
// that you process e.g. in an Idle or OnTimer handle,
// or make otherwise accessible.
return 0; // (*)
}
}
(*)是次要問題:雖然0是大多數消息的“相當安全”的返回值,但這可能導致問題,例如,當調用者要求他們需要傳遞給另一個消息的緩沖區時。 繁榮!
為了防止這種情況發生,你必須對所有單獨的處理程序進行try / catch,並為每條消息決定“如果有錯誤”返回值。
另一個選擇是在出現錯誤的情況下將消息傳遞給默認處理程序,btu也可能對某些消息有問題。
使用靜態指針,初始化為NULL,並在調用WM_CREATE時創建類實例。
當然,對於除WM_CREATE之外的任何消息,如果您將使用該實例,則應仔細檢查指針是否為NULL - 以防您以意外順序獲取消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.