0

我有一个用 foxpro (~shudder~) 编写的程序,我继承了它。

问题是,它有一些 COM 控件。当您启动 2 个副本时,第二个副本将引发错误。所以我想,这可以被清理以将活动副本带到前面,只允许一个实例。

这很好,但程序需要一个命令行参数,允许它以不同的模式运行。您只能在每种模式下运行一个副本,例如

1)

"program /bos"   
"program /pos"  = OK

2)

"program /pos"
"program /pos"  = NOT OK

我想要的是这个

"program /pos"
"program /pos" - Bring currently running pos instance to the front.

"program /bos" - start a BOS instance.
"program /bos" - bring the bos instance to the front.

我希望这是有道理的。确定程序的运行实例是处于 pos 模式还是 bos 模式是一种优雅的方法,这样我就可以确定将哪个进程带到前面或是否在请求的模式下启动一个新副本。

我在这里不一定需要 foxpro 代码 - 尽管那会很好。这个概念是我所追求的,关于实现它的 Windows API 函数的一些提示也会有所帮助。例如,您能确定正在运行的进程的命令行选项吗?

4

3 回答 3

1

命名互斥体将完全满足您的需求。但是,如果您确实想查看所有可见进程的命令行,并且您的目标是 Windows XP 或更高版本,则可以使用 WMI:WIN32_Process具有在 XP / Server 2003 中引入的 CommandLine 属性。

于 2009-11-17T10:39:25.747 回答
0

我认为您无法获得除您之外的进程的命令行。

一种常见的方法是使用命名的 mutex。当程序启动时,它会抓取互斥锁,如果不能,则另一个实例已经在运行。

没有理由不能使用两个命名的互斥锁——一个用于/pos模式,一个用于/bos模式。

于 2009-11-16T20:38:37.320 回答
0

GetCommandLine将返回命令行参数;然后,我将使用命名互斥锁作为唯一标识符来确定进程是否已经在运行。如果您将命令行参数(或您正在寻找的特定部分)作为互斥锁名称的一部分,那么您可以获得您正在寻找的行为。

于 2009-11-16T20:39:55.740 回答