2016-10-19 9 views
0

別のプロセスでリモートウィンドウを操作しようとしています。 CWndのラッパークラスを作成し、コンストラクター&コピーコンストラクターを作成しようとしています。したがって、私のアプリケーションは、同じHWNDを結ぶラッパークラスの複数のインスタンスを持つことがあります。複数のCWndが同じHWNDを添付できない理由

エラーは言う:

デバッグアサートに失敗しました!ここで

サンプルコードされています

CWnd wnd1, wnd2; 
wnd1.Attach((HWND)1); 
wnd2.Attach((HWND)1); // Error happens in this line 
+0

これは文字通りあなたがやろうとしていることですか?ハンドルに一定の値をキャストしますか? –

+0

これは単なる例です。私はそれが本当のHWNDでも起こると信じています。 – user1633272

+0

あなたの 'CWnd'クラスを表示してください。また、 'HWND'は参照カウントではないので、複数のラッパーが同じオブジェクトを保持している場合、' HWND'が早期に破棄されないように、所有権をネゴシエートできる必要があります。 – andlabs

答えて

5

MFCは(一部で)は、Windows APIの周りのリソース管理ラッパーです。 HWND秒とCWnd秒の間の厳密な所有関係を維持します。ネイティブHWNDは、たかだか1つしか所有できませんCWndオブジェクトです。

これはエラーを説明しています。

は今のソリューションへ:あなたはないCWndに取り付ける、とにかく外国HWNDを所有してますので、すでに間違ったアプローチです。 CWndはリソース管理(あなたが所有していないリソースには必要ない)を提供するだけなので、何も購入しません。

解決方法:Drop MFC。 Windows APIでHWNDを使用してください。


MFCチェック現在CWndオブジェクトに接続されているすべてのHWND S、のリストを保持することにより、この不変。 CWnd::FromHandlePermanentはそのリストを検索します。非NULL値を返すと、アサーションが発生します。

+0

私は今、潜在的な*ソリューション*を持っている、ラッパークラスはHWNDを保持し、このようなメソッドを公開:CWnd * GetWnd(){return CWnd :: FromHandle(innerHandle); } これまでのところうまく動作します。 – user1633272

+0

@ user1633272:これは確かに解決策でも、潜在的な解決策でもありません。あなたが所有していないオブジェクトの所有権で悩んではいけません。 – IInspectable

+0

ご協力ありがとうございます。 MSDNのドキュメントでは、CWnd :: FromHandleをリモートHWNDに使用しないでください。私はそれがWindows APIがどのように動作するのかは謎だと思う。たぶん疑問があるかもしれません:CWndを使ってリモートHWNDを管理できますか? :) – user1633272

関連する問題