我有一个旧的基于命令行的程序(如果重要的话,它的fortran)是当用户单击按钮时从C#应用程序打开的。如果命令行程序在运行时关闭,则数据将损坏。有什么方法可以防止人们在运行时关闭它?像使[x]不可用或以某种方式将程序嵌入我的程序中?
System.Diagnostics.Process pname =
System.Diagnostics.Process.Start(Path.Combine(Application.StartUpPath,
"diag_main.exe"));
pname.Exited += new EventHandler(pname_Exited);
注意:我仍然希望看到应用程序正在运行,并且在完成时会自行关闭,只是无法让人们在运行过程中杀死该应用程序。
最佳答案
一个需要大量编程但可以完成的解决方案:
编写一个单独的程序,以截获该程序的屏幕输出,然后以某种方式将其发送到您的程序。在隐藏的窗口中运行该程序,它会旋转并运行应用程序,并将输出发送到您的程序。
几乎可以肯定,拦截器的至少一部分将必须组装。
编辑:即使程序仅写入标准输出,重定向stdout也不会执行此操作-他希望显示输出。
可能需要拦截三件事:
Int 21h文件系统写入。这些是可以通过重定向stdout来拦截的。请注意,某些程序可能会写入实际代表stdout文件的不同句柄编号-在程序的句柄表中查找要写入的句柄,并将其与stdout条目(第二个条目为IIRC)进行比较-如果它们匹配它实际上是屏幕输出。
第二层是IIRC int 10h。有几个子调用必须被拦截。
最后,程序可以直接进行屏幕写操作。拦截这些将是的主要痛苦,我什至不考虑尝试(您必须基本上重写dos框。)相反,经常将屏幕内存与保存的副本进行比较以查找更改。
在这三种情况下,例程的至少一部分将必须以汇编的形式编写。
我已经完成了第一个,第二个则玩了一点,但后来我发现不做就可以解决。我从未尝试过第三次。
关于c# - 防止用户关闭通过C#程序打开的应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3326819/