关于程序互斥更深一步的探讨!见者有分!

jinn 2003-12-23 04:05:45
我在搞一个图片浏览的软件,现想只能一个实例运行(已实现),
当用户启动第二个实例时把命令行参数传给第一个实例并退出,第一个实例根据传过来的参数打开相应的图片!如果参数为空,仅激活第一个实例。(未实现,请教!)
请教好的实现方法!
...全文
42 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinn 2003-12-25
  • 打赏
  • 举报
回复
多谢各位了,散分!
modena 2003-12-25
  • 打赏
  • 举报
回复
哎,如果数据量较小,还不如用共享数据段的方式
modena 2003-12-25
  • 打赏
  • 举报
回复
HANDLE hEventStation = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "MyProgram");

if(hEventStation)
{
if(m_lpCmdLine[0] != '\0')
{
strcpy(g_szOpenFileName, m_lpCmdLine);

if( g_hMainWnd && IsWindow( g_hMainWnd ) ) {
PostMessage(g_hMainWnd, WM_OPENFILE, 0, 0);
}
}
else
{
// 防止程序重入
AfxMessageBox("程序已经启动, 请关闭该程序或重新启动计算机!");
::CloseHandle(hEventStation);

return FALSE;
}
}
else
{
hEventStation = ::CreateEvent(NULL, TRUE, TRUE, "MyProgram");
}
jinn 2003-12-25
  • 打赏
  • 举报
回复
我现用剪贴板可以实现,但不知WM_COPYDATA的具体用法,请指教!
有详细例子就可以散分了!
fbmsf 2003-12-24
  • 打赏
  • 举报
回复



这不是互斥的问题呀,这个是一个进程间通行的问题呀。
你要考虑的是怎么把第二个进程的参数,传入到第一个进程里面去。
我的建议使用消息机制(WM_COPYDARA),景象文件(reateFileMapping).
sharkhuang 2003-12-24
  • 打赏
  • 举报
回复
mark
wyjok 2003-12-24
  • 打赏
  • 举报
回复
(1)先用mutex确定是否已有一个实例在运行。
(2)再用WM_COPYDATA传递参数。
lzzqqq 2003-12-24
  • 打赏
  • 举报
回复
在CApp的instance里面加上
HWND hwnd=::FindWindow(NULL,MAIN_TITLE);
if (hwnd!=NULL)
{
::PostMessage(hwnd,WM_COMMAND,ID_MENUITEM_SHOW,0);
return false;
}
microyzy 2003-12-24
  • 打赏
  • 举报
回复
用mutex就已经很简单了
两个实例之间的数据传递可以用进程间通讯啊,不过是两个普通的进程而已
dde也可以,8过我学得晚,现在普天边地的都是com了,不会dde了,呵呵
jinn 2003-12-23
  • 打赏
  • 举报
回复
To:kulukyo,
我看了那个地址的帖子,但好象没有解决以下的问题:

那么我如何得到已经在运行实例中的数据呢?
比如,已经运行了一个Pro.exe,其中有一个int,我运行第二个Pro.exe时,希望第二个Pro.exe在检测到已经有一个实例在运行以后,把那个实例中的int加一,然后第二个实例结束。
再不用外部文件的前提下,能不能作到。”
如何用户自定义消息实现,不用DDE,或内存共享这类!
谢谢!

vcforever 2003-12-23
  • 打赏
  • 举报
回复
CString strClassName="SingleInstance";
// 判断是否有一名为"SingleInstance"的mutex存在
m_hMutex = OpenMutex (MUTEX_ALL_ACCESS, FALSE, strClassName) ;
if (m_hMutex == NULL)
{
// m_hMutex不存在,表示没有其它实例在运行,创建一个m_hMutex
m_hMutex = CreateMutex (NULL, TRUE, strClassName) ;
}
else
{
// 如果m_hMutex存在,表示已经有一个实例在运行,
// 或者其它的程序创建了一个名为"SingleInstance"的m_hMutex
//在这里用FileMapping或其他进程通信的方法把命令行参数传递到第一个实例

return FALSE;
}

进程通信方面就参考以下以前的帖子或相关资料吧!

做个提示!
kulukyo 2003-12-23
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2221/2221405.xml?temp=.2513697
这个肯定能解决你的问题,完全满足你的要求

我最近做了一个程序就是和你的要求差不多的,
如有问题和我交流kulukyo@263.net
Semigod 2003-12-23
  • 打赏
  • 举报
回复
使用 CMutex 以及 内存映射 应该不难实现

不行了就用DDE吧

16,551

社区成员

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

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

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