当外部脚本激活事件炸弹时,VB.NET exe在激活事件炸弹时与进程外COM对话

当外部脚本激活事件炸弹时,VB.NET exe在激活事件炸弹时与进程外COM对话,vb.net,com,vbscript,crash,out-of-process,Vb.net,Com,Vbscript,Crash,Out Of Process,我编写了一个VB.NET Windows窗体应用程序,每当激活事件触发时,它都会从进程外COM对象请求一个字符串。我的窗体有两个选项卡,因此每次窗口获得焦点时,我都需要以编程方式切换到正确的选项卡。工作正常,直到 碰巧有人运行了包含以下内容的vbscript(是的,脚本,不是exe): Set shell = CreateObject("WScript.Shell") shell.AppActivate("Window Title That Matches My App") 此

我编写了一个VB.NET Windows窗体应用程序,每当激活事件触发时,它都会从进程外COM对象请求一个字符串。我的窗体有两个选项卡,因此每次窗口获得焦点时,我都需要以编程方式切换到正确的选项卡。工作正常,直到

碰巧有人运行了包含以下内容的vbscript(是的,脚本,不是exe):

    Set shell = CreateObject("WScript.Shell")
    shell.AppActivate("Window Title That Matches My App")
此脚本始终使我的应用程序崩溃。通常情况下,异常对话框无法自行绘制。我必须从任务经理那里杀了它。有时,异常是可读的。(我还通过使用Visual Studio附加到正在运行的exe来确认异常)。它是:“System.Runtime.InteropServices.COMException(0x8001010D):由于应用程序正在调度输入同步调用,因此无法进行传出调用。”

真正困扰我的是,我的应用程序使用互斥锁进行多实例检测,如果现有实例正在运行,我自己的代码(编译)使用VB.NET自己的AppActivate关键字,这不会使我的应用程序崩溃。它激活正在运行的实例,并按预期退出冗余实例

这个问题似乎完全是由cscript/wscript的AppActivate触发的。我写了一个3-liner.vbs来确认这一点。它是可重复的


在我编译的应用程序中,有没有办法阻止或避免这种情况的发生?

我不清楚为什么这种方法能够解决问题,但它确实有效:

  • 在表单中添加计时器
  • 将所有激活的代码移到计时器的勾号事件中
  • 使_激活事件启动计时器
  • 使_Tick事件停止计时器,然后执行COM操作

  • 进程外服务器易受攻击,另一个应用程序可能会与其联系,使其行为不端,从而影响所有连接的客户端。如果您没有服务器的源代码,那么您几乎无能为力。我们当然不能。是的,服务器是我无法控制的专有第三方设备。我是否通过将其包装成一个try/catch来制造任何巨大的陷阱?这会有帮助吗?我仍然想知道VB.NET的AppActivate和Vbscript的AppActivate有什么区别。