Программа
// Для чтобы программа не запускалась второй раз надо модифицировать проектный файл (в данном примере это Project1.cpp):
#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
const char *NamedMutex= "OneOnly";
HANDLE CheckInstance(const char *Name)
{
HANDLE Mutex = CreateMutex(NULL, true,Name);
int er = GetLastError();
if (er) return 0;
return Mutex;
}
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE Mutex = CheckInstance(NamedMutex);
if (!Mutex)
{
ShowMessage("Уже работает");
ReleaseMutex(Mutex);
return 1;
}
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
// Для чтобы программа не запускалась второй раз напишите следующий код:
BOOL WeAreAlone(LPSTR szName)
{
HANDLE hMutex=CreateMutex(NULL,TRUE,szName);
if (GetLastError()==ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
return false;
}
return true;
}
//В CreatForm пишишь проверку:
if (WeAreAlone("Some_Unique_Name_Or_Other"));
else
{
ShowMessage("Такая программа уже работает!");
exit(0);
}
Автор:
// Чтобы узнать каталог напишите следющий код:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Label1->Caption = Application->ExeName;
Label2->Caption = ParamStr(0);
Label3->Caption = GetCurrentDir();// текущая папка (может измениться!)
char ExeName[MAX_PATH];
GetModuleFileName(HInstance, ExeName, sizeof(ExeName));
Label4->Caption=ExeName;
}
// Напишите следющий код:
ShowWindow(Application->Handle, SW_HIDE);//Скрыть
ShowWindow(Application->Handle, SW_SHOW);//Показать
Для начала надо зайти Project->Options затем: На вкладке Compiler нажать "Release", на вкладке Packages снять галку с "Build with runtime packages" и на вкладке Linker снять галку с "Use dynamic RTL"
Project->Options->Load Icon
// Напишите следющий код:
HANDLE ProcessHandle, ThreadHandle;
DWORD ProcessID = GetCurrentProcessId();
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
SetPriorityClass(ProcessHandle,HIGH_PRIORITY_CLASS);
ThreadHandle = GetCurrentThread();
SetThreadPriority(ThreadHandle,THREAD_PRIORITY_TIME_CRITICAL);