|
Программирование >> Перегруженные имена функций и идентификаторы
} end case deal with other error cases default: throw Exception( 4 ); } end switch } end if return realCount; ---------------------------------------------------void fastcall TComPort::SetBaudRate(int b) GetCommState(hCom, &dcbBuf); dcbBuf.BaudRate = b; SetCommState(hCom, &dcbBuf); ----------------------------------------------------DWORD fastcall TComPort::ClearError(void) COMSTAT stCom; DWORD ierr; ClearCommError(hCom,&ierr,&stCom); return ierr; Как отследить запуск второй копии приложения? 1. Воспользоваться функцией FindWindow(). Ее использование затруднительно если меняется заголовок окна или есть другое окно с таким же заголовком и классом окна. 2. Воспользоваться RxLib-овской функцией ActivatePrevInstance, которая в конце-концов тоже использует эту функцию. Однако ActivatePrevInstance так же выполняет некоторые полезные действия (активизация предыдущей копии приложения). 3. Можно создавать семафоры, мутексы, но тогда при некорректном завершении программы, ты ее больше не запустишь. Пример использования мутекса: HANDLE hMutex=CreateMutex(NULL, FALSE, YourMutexName ); if(GetlastError()==ERROR ALREADY EXISTS ) здесь надо бы активизировать предыдущую копию приложения. как это сделать, см. ActivatePrevInstance(). else try { Application->Initialize(); Application->CreateForm( classid(TForm1), &Form1); Application->Run(); catch (Exception &exception) Application->ShowException(&exception); CloseHandle(hMutex); 4. Можно получить имя исполняемого файла для каждого из запущенных процессов, после чего сравнить его с именем .exe вашего процесса... Недостатки способа: а) Две копии приложения могут быть запущены из разнгх мест. б) Различные методы получения списков запущенных процессов дя 9x и NT. Пример для 9x: #include <tlhelp32.h> #include <dos.h> USERES( Project1.res ); USEFORM( Unit1.cpp , Form1); ---------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) HANDLE hSnapshot=CreateToolhelp32Snapshot (TH32CS SNAPPROCESS, 0); PROCESSENTRY32 pe; pe.dwSize=sizeof(pe); bool Running=false; DWORD CurrentProc=GetCurrentProcessId(); if(Process32First(hSnapshot, &pe)) do { if(CurrentProc!=pe.th32ProcessID && strcmpi(pe.szExeFile, argv[0])==0) Running=true; break; }while(Process32Next(hSnapshot, &pe)); CloseHandle(hSnapshot); if(Running) return 1; try { Application->Initialize(); ...... 5. Использовать временный файл: WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) HANDLE hFile = CreateFile( c:\\tempfile.tmp , GENERIC WRITE, 0, NULL, CREATE ALWAYS, FILE ATTRIBUTE NORMAL FILE FLAG DELETE ON CLOSE, NULL); if(hFile == INVALID HANDLE VALUE) return 1; try { Application->Initialize();
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |