Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当控件添加到表单中时,应用程序外接程序(通过COM)冻结?_C#_.net_Winapi_Com - Fatal编程技术网

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");