13,825
社区成员
发帖
与我相关
我的任务
分享
class TSharedMem
{
private:
bool FCreated;
BYTE * FFileView;
HANDLE FHandle;
DWORD FSize;
public:
TSharedMem(const char * Name, DWORD Size)
{
FHandle = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, Size, Name);
if (FHandle != NULL)
{
FCreated = GetLastError() == 0;
FFileView = (BYTE*)MapViewOfFile(FHandle, FILE_MAP_WRITE, 0, 0, Size);
if (FFileView && FCreated)
{
ZeroMemory(FFileView, Size);
}
FSize = Size;
}
else
{
FFileView = NULL;
FSize = 0;
}
}
~TSharedMem()
{
if (FFileView)
{
UnmapViewOfFile(FFileView);
}
if (FHandle)
{
CloseHandle(FHandle);
}
}
__property BYTE * Buffer =
{
read = FFileView
};
__property bool Created =
{
read = FCreated
};
__property DWORD Size =
{
read = FSize
};
};
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
{
TSharedMem ShareMem("MyAPP", 8);
if (ShareMem.Buffer[0]++ >= 2) return 0;
Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->CreateForm(__classid(TfrmMain), &frmMain);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
HINSTANCE g_hinst;
#include <tlhelp32.h>
bool FindApp(AnsiString AppName)
{
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe;
int AppCount = 0;
pe.dwSize = sizeof(pe);
BOOL bNext=Process32First(hSnap, &pe);
while(bNext)
{
if(strcmp(pe.szExeFile,AppName.c_str())==0)
{
//strcpy(szBuffer, pe.szExeFile);
//break;
//CloseHandle(hSnap);
//return true;
AppCount++;
}
bNext=Process32Next(hSnap, &pe);
}
CloseHandle(hSnap);
if(AppCount > 2)//关键就是这里控制同名的进程数
return true;
else
return false;
}
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE hInstance, LPSTR, int)
{
try
{
if(FindApp(ExtractFileName(Application->ExeName)))//这里调用判断
return 0;
Application->Initialize();
g_hinst = hInstance;
Application->Title = "解包服务控制台";
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
只能这样了HANDLE __stdcall CrnGetValidMutex()
{
HANDLE hMutex1 = ::CreateMutex(NULL, TRUE, TEXT("CrnTestAppInstance1"));
if (::GetLastError() == ERROR_ALREADY_EXISTS)
{
if (hMutex1)
::CloseHandle(hMutex1);
HANDLE hMutex2 = ::CreateMutex(NULL, TRUE, TEXT("CrnTestAppInstance2"));
if (::GetLastError() == ERROR_ALREADY_EXISTS)
{
if (hMutex2)
::CloseHandle(hMutex2);
return NULL;
}
else
return hMutex2;
}
else
return hMutex1;
}
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE hMutex = NULL;
try
{
hMutex = CrnGetValidMutex();
if (!hMutex)
{
::MessageBox(NULL, TEXT("已经有两个实例运行了!"),
TEXT("提醒"), MB_OK | MB_ICONWARNING);
return -1;
}
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
::ReleaseMutex(hMutex);
::CloseHandle(hMutex);
return 0;
}