Выдвижение активной программы на передний план — с изюминкой

У меня есть программа, написанная на foxpro (~содрогаюсь~), которую я унаследовал.

Проблема в том, что в нем есть некоторые элементы управления 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 для ее достижения также будут полезны. например можете ли вы определить параметры командной строки запущенного процесса?


person hookenz    schedule 16.11.2009    source источник


Ответы (3)


Именованный мьютекс сделает именно то, что вам нужно. Однако если вы хотите видеть командную строку для всех видимых процессов и ориентируетесь на Windows XP или более позднюю версию, вы можете использовать WMI: WIN32_Process имеет свойство CommandLine, которое было введено в XP/Server 2003.

person stuartd    schedule 17.11.2009


GetCommandLine возвращает аргументы командной строки; затем я бы использовал именованный мьютекс в качестве уникального идентификатора, чтобы определить, запущен ли уже процесс. Если вы включите аргументы командной строки (или конкретную часть, которую вы ищете) как часть имени мьютекса, вы можете получить поведение, которое ищете.

person Eric Brown    schedule 16.11.2009
comment
GetCommandLine возвращает аргументы командной строки только текущего процесса. Однако подход с именованным мьютексом полезен. - person hookenz; 16.11.2009
comment
верно, но вас не волнует командная строка другого процесса. Все, что вам нужно, это имя мьютекса; поскольку оба процесса выполняют один и тот же код, мьютекс будет иметь одно и то же имя, если аргументы командной строки одинаковы. - person Eric Brown; 17.11.2009