Здравствуйте Igor_S, Вы писали:
IS>Привет ! IS>Как можно проверить в самой программе , запущена она уже или нет? IS>Мне нужно избежать двойного запуска программы.
IS>Игорь.
Тебе поможет пойск такого окна в системе по именни класса и заголовку
Делай так:
Здравствуйте Igor_S, Вы писали:
IS>Привет ! IS>Как можно проверить в самой программе , запущена она уже или нет? IS>Мне нужно избежать двойного запуска программы.
IS>Игорь.
Здравствуйте 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);
}
//запущен первый экземпляр приложения
,,,,,,,,,,,
Здравствуйте _ssss, Вы писали:
S>int WINAPI WinMain(HINSTANCE hinstEXE, HINSTANCE, PSTR pszCmdLine, int nCmdShow) S>{ S> //создаем любой объект ядра. Какой именно не принципиально. Пусть будет mutex.
Принципиально.
Объект должен подерживать избирательный доступ (эксклюзивно открываться) и быть именованным (причем имя должно помещаться в \BaseNamedObjects).
Причем оба условия обязательные.
Например, попробуйте так с Section, Process или CompletionPort поиграться — ничего не выйдет.
Здравствуйте 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> }