1

首先,有一点背景:我有一个程序,它充当了一台实验室设备的前端。实验室设备附带的软件有一个 TCP/IP 接口,并在我正在开发的应用程序的后台运行。此外,Windows XP/visual studio 2008/.net 3.5。

我遇到的问题是,如果我尝试使用 process.start("PROG-XY.exe") 从我的程序中启动 OEM 软件,我会收到 BSOD(错误检查 0xF4:CRITICAL_OBJECT_TERMINATION http://msdn.microsoft .com/en-us/library/windows/hardware/ff560372%28v=vs.85%29.aspx)。

问题是,只有在我事先运行 Process.GetProcessesByName("doesn't matter what this string is") 时才会发生蓝屏死机。(如果它已经在运行,它将用于查找进程并在启动它之前将其终止)

如果我不运行 getprocessesbyname,我可以毫无问题地启动该过程。我也可以在不受 Windows 影响的情况下启动和终止该进程。

我什至尝试通过从我的程序中调用批处理文件来启动 OEM 软件来启动程序,但这是同一回事。

我开始了一个新项目,以确保上面三个按钮不会发生其他事情:

1) 运行 getprocessesbyname


process.getprocessesbyname("notepad")

2) 直接启动OEM软件


dim ps = new ProcessStartInfo
ps.filename = "C:\program files\OEM\PROG-XY.exe" ' path to the OEM software
ps.WorkingDirectory = "C:\program files\OEM" ' It has to start in the right directory
process.start(ps)

3) 通过批处理文件启动 OEM(批处理文件将目录更改为“C:\program files\OEM”,然后运行 ​​PROG-XY.exe)


process.start("C:\batchfile.bat")

以下导致 BSOD 的结果:

  • 运行 2,然后运行 ​​1
  • 运行 2,然后手动打开/关闭 OEM 软件,然后 1
  • 运行 2,然后运行 ​​3

以下不会导致 BSOD 的

  • 运行 1
  • 运行1,关闭软件,再次运行1
  • 运行1,关闭OEM软件,手动打开关闭,按3
  • 运行 1,然后运行 ​​3
  • 运行2,重启前端软件,点击1

此外,如果我将文件名替换为以记事本开头,则一切运行良好且花花公子,因此它与 OEM 软件有关,但是 getprocessesbyname 会做什么使其发生灾难性故障,我不知道。

最后一件事是,如果我处于调试模式并附加了 Visual Studio 调试器,无论我做什么,我都不会出现蓝屏。

4

0 回答 0