C# 当控件添加到表单中时,应用程序外接程序(通过COM)冻结?
我正在通过C# 当控件添加到表单中时,应用程序外接程序(通过COM)冻结?,c#,.net,winapi,com,C#,.net,Winapi,Com,我正在通过COM为现有应用程序开发扩展。 要扩展的应用程序的当前界面允许创建自定义属性窗口,并在该应用程序中使用它们 现在,我正在使用.NET来实现这一目的,并且遇到了一些奇怪的问题: 正如您在下面看到的,属性表实际上得到了扩展,但在扩展之后,一些奇怪的事情开始发生 基本上,如果我切换到Ololo选项卡,然后返回到其他3个选项卡(属性、绘图或服务)中的任何一个,应用程序将冻结。我还知道冻结发生在某个非托管代码块内部 另一个有趣的事实是,如果我不编写extensionForm.Control
COM为现有应用程序开发扩展。
要扩展的应用程序的当前界面允许创建自定义属性窗口,并在该应用程序中使用它们
现在,我正在使用
.NET
来实现这一目的,并且遇到了一些奇怪的问题:
正如您在下面看到的,属性表实际上得到了扩展,但在扩展之后,一些奇怪的事情开始发生
基本上,如果我切换到Ololo
选项卡,然后返回到其他3个选项卡(属性
、绘图
或服务
)中的任何一个,应用程序将冻结。我还知道冻结发生在某个非托管代码块内部
另一个有趣的事实是,如果我不编写
extensionForm.Controls.Add(new Button())
(有或没有Suspend/Resume布局调用),一切正常。因此,如果最近构造的表单上没有控件(按钮或任何其他),它不会冻结
在冻结之前,有一个Spy++
登录到Ololo
窗口(最后一条消息是WM\u CTLCOLORBTN
,就在应用程序冻结之后):
将一切结合在一起:
- 只有当我从
切换到其他选项卡,然后再次切换到Ololo
选项卡时,才会发生冻结Ololo
- 只有当集成表单上至少有一个控件时才会发生冻结,没有控件的表单不会冻结
- 应用程序目前没有运行任何托管代码,也没有花费任何CPU时间
那么-在这种情况下,有什么想法/解决了类似的问题/等可以帮助我吗?资源句柄可能不正确。正如您所提到的,只有当集成表单中至少有一个控件时才会发生这种情况,当再次激活时,Ololo选项卡无法找到它的资源。请尝试第一次存储资源句柄,然后在每次选项卡处于活动状态时将其还原。已初始化.NET中窗体的Win32
HWND
句柄。
我想这可能是个问题
您可能认为句柄是在您的行ExApplAPI.AddCustomPropertyWindow(extensionForm.handle.ToInt32(),“Ololo”)中创建的代码>由于访问句柄
属性。
这是真的,什么都承认
但是,它会为表单
本身创建句柄,但不会创建子控件的句柄(在本例中为按钮
)。这可以通过调用CreateControl
方法来强制执行。看
我不知道是否没有按钮手柄可能是您的问题的原因,但这肯定是我会调查的事情
总之,我建议将代码更改为:
extensionForm = new Form();
extensionForm.SetBounds(0, 0, 100, 100);
extensionForm.Controls.Add(new Button());
extensionForm.CreateControl();
ExApplAPI.AddCustomPropertyWindow(extensionForm.Handle.ToInt32(), "Ololo");
是否引发了任何异常?
在使用WPF和COM时,我们有一个类似的行为,它通过使用调用reset double calculation来解决
[DllImport(“msvcr70.dll”,CallingConvention=CallingConvention.Cdecl)]
公共静态外部int_fpreset() 要了解应用程序挂起的原因,有两件事可能会有所帮助:
当应用程序挂起时,是否可以发布UI线程的堆栈跟踪
哪个线程调用您的代码并实际创建窗口
这取决于在AddCustomPropertyWindow中执行的操作。WinForm不应作为宿主/父对象。您可以尝试使用Control/UserControl。否则,您是否可以发布一些复制问题的示例代码?我认为您应该为我们提供更多的代码来识别问题。请,我非常确定,这不仅仅是按钮控制,如果您对选项卡“Ololo”执行任何操作,它将冻结您的应用程序,+您是否尝试创建另一个选项卡,我的意思是,只是玩弄你的应用程序,+试着调试并找出它的缺陷,有时你会在代码中出现异常,但它不会将它们显示为错误。我同意,你应该使用一些控件(可能来自面板)而不是表单。如果您需要在窗口中显示相同的内容,只需将其宿主在窗体中即可。
extensionForm = new Form();
extensionForm.SetBounds(0, 0, 100, 100);
extensionForm.Controls.Add(new Button());
extensionForm.CreateControl();
ExApplAPI.AddCustomPropertyWindow(extensionForm.Handle.ToInt32(), "Ololo");