请教一下关于一个应用只运行一个实例的技术细节问题

goodname 2005-05-19 08:12:19



标题:
请教一下关于一个应用只运行一个实例的技术细节问题
内容:
Winamp(一种播放mp3的软件,鼎鼎大名)具有如下两个功能
1.可以只运行一个实例
2.当你双击硬盘上的扩展名为mp3的文件的时候,将自动打开Winamp播放;
但是如果有一个实例正在运行的时候,则清空当前列表,把双击的文件名
加入列表内开始播放。

其中,第1个特征和第2个特征的头半部分我都能实现,只是第2个特征的
后半部分难以实现,不知道是什么原理。
我的程序的
BOOL CMyPlayerApp::InitInstance()的处理中
首先::GlobalFindAtom()查找是否已经运行,
如果存在,就return FALSE;直接结束运行的新的实例了。
如果想实现我说的那个问题的话,是不是在返回之前,发送个
WM_COPYDATA消息给已经存在的实例?
还是另有高明的办法来实现,请高人指点!

...全文
208 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaotao0982 2005-05-22
  • 打赏
  • 举报
回复
采用单立模式,用静态声明,看看
horisly 2005-05-22
  • 打赏
  • 举报
回复
学习.
oyljerry 2005-05-22
  • 打赏
  • 举报
回复
进程间通信把播放的信息传递过去
sboom 2005-05-22
  • 打赏
  • 举报
回复
我觉得很多方法,用进程间通信的方法应该可以吧。
布学无数 2005-05-22
  • 打赏
  • 举报
回复
再说说如何接受WM_COPYDATA传过来的文件名:
PCOPYDATASTRUCT pcds;
TCHAR szMp3File[256];
.
.
.
case WM_COPYDATA:
pcds = (PCOPYDATASTRUCT)lParam;
lstrcpyn(szMp3File,pcds->lpData,pcds->cbData);
.
.
.
布学无数 2005-05-22
  • 打赏
  • 举报
回复
创建互斥比较方便:
HANDLE hMutex;
hMutex = CreateMutex(NULL,TRUE,"互斥名");
if(hMutex != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
{
HWND hwnd = FindWindow("窗口类","窗口标题"); // 窗口标题可以不要
if(IsWindow(hwnd))
{
COPYDATASTRUCT cds = {NULL};
cds.cbData = lstrlen("mp3文件名") + 1;
cds.lpData = (LPVOID)"mp3文件名";
SendMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&cds);
}
}
.
.
.
ReleaseMutex(hMutex); // 退出时记得释放互斥
flyelf 2005-05-20
  • 打赏
  • 举报
回复
WM_COPYDATA这个方法也可以
只要是进城间通讯的方法都可以

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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