【问题标题】:How to make program dependent of another program?如何使程序依赖于另一个程序?
【发布时间】:2019-11-08 05:48:52
【问题描述】:

我有两个 Windows 程序,p1p2 其中 p1main 程序。我想实现这样的情况,即程序 p2 依赖 对主程序,我的意思是程序二不能执行减去首先执行主程序,也就是说有人在没有主程序的情况下执行程序 p2 它应该说:

没有 p1 或主应用程序,p2 无法单独启动。

这就是我想要实现的概述。程序,p1是我自己用delphi开发的程序。

希望它有意义。

【问题讨论】:

  • 对我来说听起来像 XY problem
  • 是的 p2 不是我的程序,但我的程序 p1 运行它来启动某个服务
  • 听起来像是 XY 问题。您的程序不依赖于其他程序。它取决于其他程序的行为和服务。我会关注行为或服务而不是程序。

标签: windows delphi


【解决方案1】:

有很多方法可以做到这一点,甚至很难知道从哪里开始。您可以使用互斥体、管道、共享内存或任何其他 IPC——进行通信或检查它是否已创建。您可以从 app1 生成 app2 并验证父进程。如果使用后端服务器,您可以发送两个请求,服务器可以验证是否首先打开了 app1。

假设您拥有 app1 而不是 app2,您最简单的选择是使用内核驱动程序。添加一个进程通知例程并检测 app1 和 app2 何时启动,并缓存它们。如果 app2 启动但 app1 还没有从内核域终止 app2,否则让它运行。如果需要,您还可以检测 app1 何时关闭并同时终止 app2。

【讨论】:

  • 是的,我读过有关使用内核驱动程序的信息,这似乎是我想要的,但未能实现它。可以帮我一个提示,谢谢
  • 可能值得指出的是,编写内核驱动程序并不是一件容易的事。
  • 不能只导入一些像 kernel32.dll 这样的 dll 文件,它会执行我需要的任何操作
  • 不,没有那么简单:内核驱动程序不是从 kernel32.dll 调用函数的应用程序。 (如果是这样,所有 Windows 应用程序都将是“内核驱动程序”。)
  • 好吧,理论上你可能会像CreateProcess这样挂钩函数,但它不如拥有内核驱动程序那么干净。
【解决方案2】:

这是使用互斥锁的方法:

MutexHandle := CreateMutex(NIL, TRUE, PChar('Unique String'));
AppExists   := GetLastError = ERROR_ALREADY_EXISTS;

基本上,如果互斥锁是由任何进程创建的,AppExists 将是 true 或 false。

【讨论】:

  • 但是 OP 说 p2 不是他的程序,那么他怎么会得到那个 ERROR_ALREADY_EXISTS 错误呢?
  • 如果你有 p1 的源,那么让它创建互斥锁。如果您没有 p2 的源代码,那么您可以创建替代 p2 来尝试创建互斥锁,然后它仅在 ERROR_ALREADY_EXISTS 时执行真正的 p2。
猜你喜欢
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2012-11-10
  • 2016-06-24
相关资源
最近更新 更多