Просмотр всех процессов
От: Igor_S  
Дата: 11.07.02 16:01
Оценка:
Привет !
Как можно проверить в самой программе , запущена она уже или нет?
Мне нужно избежать двойного запуска программы.

Игорь.
Re: Просмотр всех процессов
От: Lefay Россия  
Дата: 11.07.02 16:08
Оценка: 2 (1)
Здравствуйте Igor_S, Вы писали:

IS>Привет !

IS>Как можно проверить в самой программе , запущена она уже или нет?
IS>Мне нужно избежать двойного запуска программы.

IS>Игорь.


Тебе поможет пойск такого окна в системе по именни класса и заголовку
Делай так:

Создай функцию регистрации класса

BOOL RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)
{
WNDCLASS wc;
wc.style=wc.cbClsExtra=wc.cbWndExtra=0;
wc.lpfnWndProc=Proc;wc.hInstance=hInst;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(brBackground+1);
wc.lpszMenuName=NULL;wc.lpszClassName=szName;
return(RegisterClass(&wc)!=0);
}

а в основной программе используй FindWindow

RegClass(WndProc,"WindowAppClass",COLOR_DESKTOP);
if(FindWindow("WindowAppClass","Title of Window"))
{exit(0);}
Взойти на гору можно разными путями, но само восхождение остается неизменным.
Re: Просмотр всех процессов
От: Dr_Sh0ck Беларусь  
Дата: 11.07.02 16:22
Оценка: 11 (1)
Здравствуйте Igor_S, Вы писали:

IS>Привет !

IS>Как можно проверить в самой программе , запущена она уже или нет?
IS>Мне нужно избежать двойного запуска программы.

IS>Игорь.


См. здесь
Автор(ы): Dr. Joseph M. Newcomer
Дата: 17.02.2001

В статье подробно рассматриваются различные способы ограничения числа запущенных копий приложения одной. Указываются недостатки и даже ошибки во многих известных методах решения задачи, которые постоянно фигурируют в конференциях и в Сети. Кроме того, указывает на различные трактовки понятия "одна копия приложения" и демонстрирует правильное решение для каждого из случаев.


P.S. Следующий раз сабж формулируй поточнее
Do not fake yourself ;)
ICQ#: 198114726
Re: Просмотр всех процессов
От: _ssss  
Дата: 12.07.02 03:57
Оценка: 3 (1)
Здравствуйте Igor_S, Вы писали:

IS>Как можно проверить в самой программе , запущена она уже или нет?

IS>Мне нужно избежать двойного запуска программы.


int WINAPI WinMain(HINSTANCE hinstEXE, HINSTANCE, PSTR pszCmdLine, int nCmdShow)
{
//создаем любой объект ядра. Какой именно не принципиально. Пусть будет mutex.
HANDLE h=CreateMutex(NULL,FALSE,"идентификатор твоего mutex'a");
//
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
//один экземпляр приложения уже есть
return (0);
}
//запущен первый экземпляр приложения
,,,,,,,,,,,

CloseHandle(h);
return(0);
}
Re: Просмотр всех процессов
От: DenisII  
Дата: 12.07.02 06:14
Оценка:
Здравствуйте Igor_S, Вы писали:

IS>Как можно проверить в самой программе , запущена она уже или нет?

IS>Мне нужно избежать двойного запуска программы.

Есть вот такой вариант:

const TCHAR AppName[] = TEXT("Application name");

BOOL CheckThis()
{
    ATOM hAtom = GlobalFindAtom(AppName);
    if (hAtom) return TRUE;
    else{
       GlobalAddAtom(AppName);
       return FALSE; 
    } 
}

int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int)
{
    if (CheckThis()) return 0;
     
    // Do something
    
    GlobalDeleteAtom(GlobalFindAtom(AppName));
    return 0; 
}
Re[2]: Просмотр всех процессов
От: vasketsov Россия http://ntprog.by.ru
Дата: 12.07.02 13:34
Оценка:
Здравствуйте _ssss, Вы писали:

S>int WINAPI WinMain(HINSTANCE hinstEXE, HINSTANCE, PSTR pszCmdLine, int nCmdShow)

S>{
S> //создаем любой объект ядра. Какой именно не принципиально. Пусть будет mutex.

Принципиально.
Объект должен подерживать избирательный доступ (эксклюзивно открываться) и быть именованным (причем имя должно помещаться в \BaseNamedObjects).
Причем оба условия обязательные.
Например, попробуйте так с Section, Process или CompletionPort поиграться — ничего не выйдет.
Васкецов Сергей
http://registry.km.ru
Re[2]: Просмотр всех процессов
От: vasketsov Россия http://ntprog.by.ru
Дата: 12.07.02 19:00
Оценка:
Здравствуйте DenisII, Вы писали:

DII>BOOL CheckThis()

DII>{
DII> ATOM hAtom = GlobalFindAtom(AppName);

Вот тут вот другой экземпляр проги проверит атом, не найдет его, и создаст

DII> if (hAtom) return TRUE;


А прога тут будет думать, что атома еще нет.
думаю, не стоит объяснять, что это неправильно.
и вообще, это уже давно решено с mutex-ами, зачем велосипед изобретать?

DII> else{

DII> GlobalAddAtom(AppName);
DII> return FALSE;
DII> }
Васкецов Сергей
http://registry.km.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.