Windows APIラッパーでは、エラーが発生したときにメッセージボックスを表示するように選択できます。私は本当にピン止めできないものがある。GetWindowLongPtrが "Class already Exists"にエラーを設定します
はここに私の主な機能です:
int main()
{
Window win; //create default window with default class (name changes each new instance)
return messageLoop(); //the familiar GetMessage() while loop, returns msg.wParam
}
このすべては、私は次のメッセージが表示されます(これは私がコピーしたときに、私が得るものです正常に動作しますが、私は私のウィンドウを閉じたときに(ちょうどXボタンを経由してテストしました)メッセージボックス):このエラーはなく、正確な理由、どこから来ている
---------------------------
Error
---------------------------
File: "G:\programming\v2\wwbasewindow.h"
Function: _fakeWndProc
Line: 61
Error Code: 1410
Error: Class already exists.
---------------------------
OK
---------------------------
は、今では澄みました。ここには_fakeWndProc
の機能があります。この関数が呼び出された後には、wrap (function, args)
の構文チェックGetLastError()
がすべて呼び出されます。これがエラーチェックを表示しない理由です。
LRESULT CALLBACK BaseWindow::_fakeWndProc (msgfillparams) //trick procedure (taken from someone's gui wrapper guide)
{
BaseWindow * destinationWindowPtr = 0; //for which window message goes to
//PROBLEM IN THE FOLLOWING LINE (gets a pointer to the window, set when it's created)
destinationWindowPtr = (BaseWindow *)wrap (GetWindowLongPtr, hwnd, GWLP_USERDATA);
if (msg == WM_COMMAND && lParam != 0) //if control message, set destination to that window
destinationWindowPtr = (BaseWindow *)wrap (GetWindowLongPtr, (hwin)lParam, GWLP_USERDATA);
if (destinationWindowPtr) //check if pointer is valid
return destinationWindowPtr->_WndProc (hwnd, msg, wParam, lParam); //call window's procedure
else
return wrap (DefWindowProc, hwnd, msg, wParam, lParam); //call default procedure
}
この呼び出しがされて、なぜ私は思ったんだけど(クラスを作成しようとしている?)さておき、私はWM_CLOSE
メッセージがやって来る時からのエラーコードをチェックしてみました。私は、行の前と後にコードを出力します。この関数はどこかに内部SendMessage
を呼び出すことを暗示するよう
Before: 0
After: 0
--->Before: 0
--->Before: 1410
After: 1410
Before: 1410
After: 1410
...
これは、私の混乱にトッピング置く:これは、最大来るものです。しかし、なぜ他の人にとって同じことをしないだろうか?
エラー自体は大きな違いはありません。プログラムが終了するとすぐに終了しますが、私はそれを掛けたくありません。どうすれば対処できますか?
注: WM_DESTROY
が表示されたら、私はちょうどPostQuitMessage (0);
を呼び出してみませんでした。そして2つのウィンドウを作成しました。どちらもクローズ時に同じエラーが発生したため、必ずしもプログラムの終了とは限りません。
また、私はPostQuitMessage
を呼び出さなかったときだけ、エラー1400(無効なウィンドウハンドル)も与えました。このエラーは、それらのウィンドウのそれぞれのウィンドウプロシージャのDefWindowProc
への呼び出しに起因しています。その上のアイデアも?
編集:
により要求に、ここwrap
のコードは次のとおりです。
// pass along useful error information (useless constants within error function)
#define wrap(...) Wrap (__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
// cstr == char *
// con == const
// sdword == int (signed dword)
// version if return value of API function is not void
template<typename TRet, typename... TArgs>
typename std::enable_if<!std::is_void<TRet>::value, TRet>::type
Wrap(con cstr file, const char * const func, con sdword line, TRet(*WINAPI api)(TArgs...), TArgs... args)
{
TRet result = api(std::forward<TArgs>(args)...); //call API function
if (GetLastError()) __wwError.set (GetLastError(), file, func, line); //set variables and create message box
return result; // pass back return value
}
// version if return value is void
template<typename... TArgs>
void Wrap(con cstr file, const char * const func, con sdword line, void(*WINAPI api)(TArgs...), TArgs... args)
{
api(std::forward<TArgs>(args)...);
if (GetLastError()) __wwError.set (GetLastError(), file, func, line);
}
私もこれと__wwError.set()
作品は100%確信しています。これでラップされた他のすべての関数は、適切なメッセージボックスを与えます。
ラップのコードを表示してください。 –
ラップは正常に動作しているはずですが、これは少しです>>これ>そのタイプのものです。 – chris
GetLastError **を呼び出していることを確認するには、** API呼び出しが失敗したときだけ**をチェックします。 –