Winapi 为什么多个CWnd可以';不要附加相同的硬件

Winapi 为什么多个CWnd可以';不要附加相同的硬件,winapi,mfc,Winapi,Mfc,我正在尝试在另一个进程中操作远程窗口。我创建了一个CWnd的包装类,并试图创建构造函数&复制构造函数。因此,我的应用程序可能有多个包装类实例附加相同的HWND 错误显示: 调试断言失败 以下是示例代码: CWnd wnd1, wnd2; wnd1.Attach((HWND)1); wnd2.Attach((HWND)1); // Error happens in this line MFC(部分)是围绕Windows API的资源管理包装器。它在HWNDs和CWnds之间保持严格的所有权关系。

我正在尝试在另一个进程中操作远程窗口。我创建了一个CWnd的包装类,并试图创建构造函数&复制构造函数。因此,我的应用程序可能有多个包装类实例附加相同的HWND

错误显示:

调试断言失败

以下是示例代码:

CWnd wnd1, wnd2;
wnd1.Attach((HWND)1);
wnd2.Attach((HWND)1); // Error happens in this line
MFC(部分)是围绕Windows API的资源管理包装器。它在
HWND
s和
CWnd
s之间保持严格的所有权关系。本机
HWND
最多只能由一个
CWnd
object1拥有

这就解释了你的错误

现在来看解决方案:由于您不拥有外部
HWND
,因此将其附加到
CWnd
已经是错误的方法。而且由于
CWnd
只提供资源管理(您不需要为您不拥有的资源提供资源管理),因此它不会为您购买任何东西

解决方案:滴下MFC。在Windows API中使用
HWND


1 MFC通过保存当前附加到
CWnd
对象的所有
HWND
s的列表来检查此不变量
CWnd::FromHandlePermanent
是对该列表的查找。如果它返回一个非空值,则会触发断言。

MFC(部分)是围绕Windows API的资源管理包装器。它在
HWND
s和
CWnd
s之间保持严格的所有权关系。本机
HWND
最多只能由一个
CWnd
object1拥有

这就解释了你的错误

现在来看解决方案:由于您不拥有外部
HWND
,因此将其附加到
CWnd
已经是错误的方法。而且由于
CWnd
只提供资源管理(您不需要为您不拥有的资源提供资源管理),因此它不会为您购买任何东西

解决方案:滴下MFC。在Windows API中使用
HWND




1 MFC通过保存当前附加到
CWnd
对象的所有
HWND
s的列表来检查此不变量
CWnd::FromHandlePermanent
是对该列表的查找。如果它返回一个非空值,则会触发断言。

这就是您真正想要做的吗?将常量值转换为句柄?这只是一个示例。我相信真实的HWND也会发生这种情况。请出示您的
CWnd
课程。还要注意的是,
HWND
s不是引用计数的,因此如果多个包装器持有同一个对象,它们必须能够协商所有权,以确保
HWND
不会提前销毁。@andlabs
CWnd
是MFCY的一部分。您正在尝试将一个工具用于它不打算用于的东西。如果你需要真正的帮助,问问你真正的问题,而不是你认为什么是你的解决方案(TL;DR:这不是)。这就是你真正想要做的吗?将常量值转换为句柄?这只是一个示例。我相信真实的HWND也会发生这种情况。请出示您的
CWnd
课程。还要注意的是,
HWND
s不是引用计数的,因此如果多个包装器持有同一个对象,它们必须能够协商所有权,以确保
HWND
不会提前销毁。@andlabs
CWnd
是MFCY的一部分。您正在尝试将一个工具用于它不打算用于的东西。如果您需要真正的帮助,请询问您真正的问题,而不是您认为是您的解决方案(TL;DR:这不是)。我现在有了一个潜在的解决方案,包装器类持有HWND,并公开这样一个方法:CWnd*GetWnd(){return CWnd::FromHandle(innerHandle);}它工作得很好。@user1633272:这肯定不是一个解决方案,甚至都不是一个潜在的解决方案。不要在你不拥有的物品的所有权上摸索。谢谢你的帮助。MSDN文档没有说CWnd::FromHandle不应用于远程HWND。我想windows API是如何工作的是个谜。也许问题是:我们可以使用CWnd来管理远程HWND吗?:)@用户1633272:对于那些没有介绍自己公理化基本规则的人来说,这只是一个谜。其中一个基本规则是:
HWND
s具有线程关联性,并且只能从其所属线程进行操作。另一个这样的基本规则是MFC类拥有资源。还有一条基本规则是,您不应该使用为您不拥有的东西建立严格所有权模型的类。这样做就是否定逻辑。那是徒劳的。(不要使用你不懂的东西。这意味着在你的情况下使用Windows API和MFC。)@user1633272:你没有问过的问题的答案是:“不,你不应该在不熟悉Windows API的情况下尝试使用MFC。”-我相信我已经在很多场合说过这一点,但你似乎没有完全理解。看一看,为你把事情放在正确的角度。这时你就会明白,MFC对于你想要完成的任何事情都不是一个合适的工具。我现在有了一个潜在的解决方案,包装器类持有HWND,并公开一个类似这样的方法:CWnd*GetWnd(){return CWnd::FromHandle(innerHandle);}它目前为止工作得很好。@user1633272:这肯定不是一个解决方案,甚至都不是一个潜在的解决方案。不要在你不拥有的物品的所有权上摸索。谢谢你的帮助。MSDN文档没有说CWnd::FromHandle不应用于远程HWND。我想windows API是如何工作的是个谜。也许问题是:我们可以使用CWnd来管理远程HWND吗?:)@用户1633272:对于那些没有介绍自己公理化基本规则的人来说,这只是一个谜。其中一个基本规则是:
HWND
s具有线程关联性,并且只能从其所属线程进行操作。另一个这样的基本规则是MFC类拥有资源。还有一条基本规则是,您不应该使用一个类,该类为对象的严格所有权建模