请问,如何能够让自己的应用程序在内存中只运行一次呢?

CandyCat 2001-03-03 12:48:00
加精
请问,如何能够让自己的应用程序在内存中只运行一次呢?如果检测到这个程序已经运行了,则需要正常退出。我该怎么办呢?
另外,安全的退出程序应该用什么代码呀?exit(0)吗?
...全文
444 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
TigerHu 2001-11-05
  • 打赏
  • 举报
回复
For reference
瑶瑶爸爸 2001-09-28
  • 打赏
  • 举报
回复
if(::GetLastError()==ERROR_ALREADY_EXISTS)//程序已经运行了
........
else
.......
blueskystudio 2001-08-07
  • 打赏
  • 举报
回复
此问题解决方案:
::FindWindow(classname,caption);
CandyCat 2001-03-08
  • 打赏
  • 举报
回复
To songshi(VCSongs)
我用的是MFC。
比如说,我在View里有一个检测函数,如果失败则应用程序退出。这是我应该怎么办呢?如何发消息呢?
还有个问题,你知道如何得到新的Platfome SDK 吗?我到微软的网址上下的安装程序并不会自动到网上下载安装,我该怎么办呢?你知道吗?
来这里回复,我好加分噢http://www.csdn.net/expert/TopicView.asp?id=79710
songshi 2001-03-08
  • 打赏
  • 举报
回复
你用的是SDK还是MFC还是其它的框架?
CandyCat 2001-03-05
  • 打赏
  • 举报
回复
ExitProcess(hinst)真的是正常退出吗?我看Windows核心编程上说它无法析构类呀,并不安全。。。
有其他的方法吗?
songshi 2001-03-04
  • 打赏
  • 举报
回复
谢谢CandyCat.(先生/小姐)
HackerII 2001-03-03
  • 打赏
  • 举报
回复
我用EXIT(0)也没出问题
HackerII 2001-03-03
  • 打赏
  • 举报
回复
CreateMutex
如果GetLastError()==ERROR_ALREADY_EXISTS,表示已经存在
详细使用方法见MSDN
Nitty 2001-03-03
  • 打赏
  • 举报
回复
1、用FindWindow(类名,标题名)找句柄作判断!
2、下次告之
songshi 2001-03-03
  • 打赏
  • 举报
回复
不用客气互相交流
songshi 2001-03-03
  • 打赏
  • 举报
回复
不用客气互相交流
jinxi_gao 2001-03-03
  • 打赏
  • 举报
回复
CYourMainWnd中的代码是为程序第一次运行时操作的。因为第一 次是不排斥的
CandyCat 2001-03-03
  • 打赏
  • 举报
回复
噢,我明白了,原来是它在建立标志。谢谢你啦~songshi(VCSongs)!
bodies 2001-03-03
  • 打赏
  • 举报
回复
用互斥(Mutex),Mutex本来是多线程同步用的,防止
多个线程访问同一资源而引发冲突。用CreateMutex可以
创建Mutex对象,实质上是一个kernel对象。

在任何Win32程序(包括GDI和Console)的启动部分加上
以下代码(Console程序的main函数、MFC程序的CWinApp
派生类的InitInstance成员函数、RawSDK程序的WinMain
函数):
hMutex=CreateMutex(
NULL,//nosecurityattributes
FALSE,//initiallynotowned
"RunOnlyOneInstance");//命名Mutex是全局对象
//在所有的process都可以访问到

if(hMutex==NULL||
ERROR_ALREADY_EXISTS==::GetLastError()){
//程序第二次或以后运行时,会得到Mutex已经创建的错误
returnFALSE;
}
嘿嘿,是不是不用FindWindow优雅简洁多了?

(程序员大本营2k)
CandyCat 2001-03-03
  • 打赏
  • 举报
回复
太好啦songshi(VCSongs),我解决啦!太感谢你了!
可是,我还有些疑问。
在“CYourApp”中的代码我明白,是要建立互斥的句柄,如果此程序已经运行,则将它设为焦点。可是,“CYourMainWnd”中的代码是什么意思呢?这时我不是已经退出程序了吗?
CandyCat 2001-03-03
  • 打赏
  • 举报
回复
可是我没有这本书呀,在那里能够下载呢?
songshi 2001-03-03
  • 打赏
  • 举报
回复
另: 安全退出可以给主窗口发WM_CLOSE
songshi 2001-03-03
  • 打赏
  • 举报
回复
给你一段代码:(use MFC)

#define INSTANCEMAINWNDPROP _T("your special string")

BOOL CYourApp::InitInstance()
{
if(CheckSingleInstance()==FALSE)
{
return FALSE; //则程序安全退出
}

//......
}

BOOL CYourApp::CheckSingleInstance()
{
::CreateMutex(NULL,TRUE,INSTANCEMAINWNDPROP);
if(::GetLastError()==ERROR_ALREADY_EXISTS)
{
//set focus to previous instance
CWnd* pPrevWnd=CWnd::GetDesktopWindow()->GetWindow(GW_CHILD);
while(pPrevWnd)
{
if(::GetProp(pPrevWnd->GetSafeHwnd(),INSTANCEMAINWNDPROP))
{
if(pPrevWnd->IsIconic())
{
pPrevWnd->ShowWindow(SW_RESTORE);
}

pPrevWnd->SetForegroundWindow();
pPrevWnd->GetLastActivePopup()->SetForegroundWindow();

break;
}

pPrevWnd=pPrevWnd->GetWindow(GW_HWNDNEXT);
}

return FALSE;
}

return TRUE;
}

int CYourMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;

::SetProp(GetSafeHwnd(),INSTANCEMAINWNDPROP,(HANDLE)1);
//......
}

void CYourMainWnd::OnDestroy()
{
::RemoveProp(GetSafeHwnd(),INSTANCEMAINWNDPROP);
CWnd::OnDestroy();
}

grasspool 2001-03-03
  • 打赏
  • 举报
回复
看看<advanced windows>吧,讲得很清楚
ExitProcess(hinst)应该是正常退出

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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