遇到一特殊的要求,运行2个实例

lovetsfuer 2011-09-17 09:11:27
只让运行一个实例方法很多,这次遇到一个特殊的要求,程序让在一台机器上只让最多运行2个实例,有神马好多思路没?
...全文
113 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2011-09-22
  • 打赏
  • 举报
回复
laowang2 2011-09-22
  • 打赏
  • 举报
回复
cczlp 2011-09-20
  • 打赏
  • 举报
回复
程序关闭前,应该使计数减1
if (ShareMem.Buffer[0]++ >= 2) {ShareMem.Buffer[0]--;return 0;}
后面return 0;前也要加ShareMem.Buffer[0]--;
cczlp 2011-09-19
  • 打赏
  • 举报
回复
借季老大的代码改改:
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;
}
fxworld 2011-09-17
  • 打赏
  • 举报
回复
用同步变量“信号量”就可以了。
zzbinfo 2011-09-17
  • 打赏
  • 举报
回复
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;
}
只能这样了
wangcftxz 2011-09-17
  • 打赏
  • 举报
回复
给楼主顶起

楼主结贴率神马意思?
ccrun.com 2011-09-17
  • 打赏
  • 举报
回复
我仔细看楼主的需求,好像并没有提到要判断同名进程,他要的是同一实例不超过两个。

我自己写一段代码来帮楼主完成需求,还是老三招之互斥。

以下代码放在主程序.cpp中:

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;
}
zzbinfo 2011-09-17
  • 打赏
  • 举报
回复
对,他只是判断有没有同名的进程[Quote=引用 4 楼 ccrun 的回复:]
zzb的代码存在逻辑漏洞,不同目录下的同名EXE会有误判。
[/Quote]
ccrun.com 2011-09-17
  • 打赏
  • 举报
回复
zzb的代码存在逻辑漏洞,不同目录下的同名EXE会有误判。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧