如何避免软件的重复运行?

zhaoxinghan 2007-07-03 11:16:23
想设计一个软件,用户在同一时间只能开启一个,一台电脑不能同时运行多个,应怎么设计?
...全文
261 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2007-08-06
  • 打赏
  • 举报
回复
mark
truelove7283159 2007-07-11
  • 打赏
  • 举报
回复
来晚了
laowang2 2007-07-11
  • 打赏
  • 举报
回复
内存映射好点.
yangar9179 2007-07-10
  • 打赏
  • 举报
回复
这么多人答了,来晚了,用互斥吧
Jim@luckeeinc.com 2007-07-04
  • 打赏
  • 举报
回复
HANDLE hMutex 互斥方法
cczlp 2007-07-04
  • 打赏
  • 举报
回复
好像大家都忘记 FAQ 的存在了
constantine 2007-07-04
  • 打赏
  • 举报
回复
看FAQ
cczlp 2007-07-04
  • 打赏
  • 举报
回复
//--季老大的代码--------------------------------------------------------------------
class TSharedMem
{
private:
bool FCreated;
BYTE *FFileView;
HANDLE FHandle;
public:
TSharedMem(const char* Name, int Size);
~TSharedMem();

__property BYTE* Buffer = {read=FFileView};
__property bool Created = {read=FCreated};
};
TSharedMem::TSharedMem(const char* Name, int 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);
}
}
else
{
FFileView = NULL;
}
}
TSharedMem::~TSharedMem()
{
if (FFileView)
{
UnmapViewOfFile(FFileView);
}
if (FHandle)
{
CloseHandle(FHandle);
}
}
/*
你可以直接使用这个class,来达到让程序只运行一个实例。方法如下:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
TSharedMem SharedMem("我的程序名", 8);
if (!SharedMem.Created) return 0;
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
*/
i_love_pc 2007-07-04
  • 打赏
  • 举报
回复
winmain函数在工程源文件下,如果你的工程名为Project1,那就打开Project1.cpp文件,按照一楼写的方法添加就可以。
zhaoxinghan 2007-07-04
  • 打赏
  • 举报
回复
C++ builder的winmain函数应该怎么修改呢?不好意思,我很菜,能说的详细一些么?
ccrun.com 2007-07-04
  • 打赏
  • 举报
回复
至少有三种以上的方法。

具体请查看FAQ。
jacknes009 2007-07-04
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
#include <string.h>
#include <fstream.h>
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
const string FMutex = "Mutex_ONLY_ONE";
//---------------------------------------------------------------------------


WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{ /*
var
hMutex: HWND;
iRet: integer;
begin
Application.Initialize;
hMutex := CreateMutex(nil,False,PChar(FMutex));
iRet := GetLastError;
if iRet <>ERROR_ALREADY_EXISTS then
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
ReleaseMutex(hMutex);
*/
HWND hMutex;
int iRet;
Application->Initialize();
hMutex = CreateMutex(NULL,False,FMutex.c_str());
iRet = GetLastError();
if(iRet != ERROR_ALREADY_EXISTS)
{
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
else
{
ShowMessage("Message");
}
ReleaseMutex(hMutex);
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
___NULL 2007-07-04
  • 打赏
  • 举报
回复
给你个最简单的,修改一下 WinMain 函数即可

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
HANDLE hMutex=CreateMutex(NULL,TRUE,"jf9i3hscb 随便写啦");
if(hMutex==NULL||GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(NULL,"系统中已存在一个正在运行的副本","XXX",MB_OK);
CloseHandle(hMutex);
return FALSE;
}

Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->CreateForm(__classid(TAboutBox), &AboutBox);
// Application->ShowMainForm = false;
Application->Run();
}
catch (Exception &exception)
...

13,825

社区成员

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

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