2009-11-16 2 views
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 здесь, хотя это было бы хорошо. Концепция - это то, что мне нужно, и некоторые подсказки в отношении функций API Windows для ее достижения также помогут. например можете ли вы определить параметры командной строки для запущенного процесса?

ответ

1

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

0

Я не думаю, что вы можете получить командную строку процесса, отличного от вашего.

Общим способом для этого является использование named mutex. Когда программа запускается, он захватывает мьютексы, и если он не может, то другой экземпляр уже запущен.

Нет причин, по которым вы не могли использовать два именованных мьютекса - один для режима /pos и один для режима /bos.

+0

Я думаю, re на что-то с именованными мьютексами, и вы правы в командной строке. Наверное, я могу записать id процесса pos или bos в текстовый файл. – Matt

+0

@Matt - Или вы можете использовать именованный раздел общей памяти для совместного использования HWND или любой другой информации, которая вам нужна ... – Aaron

0

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

+0

GetCommandLine возвращает аргументы командной строки только текущего процесса. Однако подход, названный mutex, полезен. – Matt

+0

правильно, но вам не нужна командная строка другого процесса. Все, о чем вы заботитесь, - это имя мьютекса; поскольку оба процесса работают с одним и тем же кодом, мьютекс будет иметь одно и то же имя, если аргументы командной строки одинаковы. –

Смежные вопросы