Phương pháp phổ biến nhất là sử dụng một mutex, tương tự như sau:
int WINAPI WinMain(...)
{
const char szUniqueNamedMutex[] = "com_mycompany_apps_appname";
HANDLE hHandle = CreateMutex(NULL, TRUE, szUniqueNamedMutex);
if(ERROR_ALREADY_EXISTS == GetLastError())
{
// Program already running somewhere
return(1); // Exit program
}
// Program runs...
// Upon app closing:
ReleaseMutex(hHandle); // Explicitly release mutex
CloseHandle(hHandle); // close handle before terminating
return(1);
}
Bạn phải chắc chắn rằng bạn đóng đúng cách - một vụ tai nạn chương trình mà không loại bỏ các mutex có thể có thể ngăn chặn sự chương trình từ chạy một lần nữa, mặc dù trong lý thuyết hệ điều hành sẽ làm sạch bất kỳ mutexes lơ lửng khi quá trình kết thúc.
Một phương pháp thường được sử dụng là để tìm kiếm tiêu đề cửa sổ cho danh hiệu chương trình:
HWND hWnd=::FindWindow(LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
Nếu đó là null, sau đó cửa sổ không được tìm thấy, do đó chương trình không chạy. Bạn có thể sử dụng tính năng này để tập trung vào ứng dụng đang chạy trước khi đóng phiên bản mới này, vì vậy người dùng không được tự hỏi tại sao ứng dụng không mở.
if(hWnd != NULL)
{
ShowWindow(hWnd,SW_NORMAL);
// exit this instance
return(1);
}
Nguồn
2012-01-10 07:14:33
Tại sao không nên nó được cho phép? Tôi hỏi vì nếu chương trình là một cái gì đó giống như một máy chủ lắng nghe trên một số cổng cố định, bạn không thực sự phải làm bất cứ điều gì đặc biệt. – hvd
@hvd, có nhiều loại chương trình, không nên cho phép thực hiện nhiều phiên bản. Nếu không, sẽ không có mutexes trong thư viện hệ thống. – Griwes
Có ứng dụng đó là một máy chủ, nhưng nó có thể chạy cho nhiều trường hợp nhưng không phải với cùng một đối số. nếu chúng ta vượt qua cùng một đối số từ dịch vụ cửa sổ và bắt đầu ABC.exe và từ phím tắt Desktop với cùng một đối số ABC.exe thứ hai không nên bắt đầu. –