标题:
请教一下关于一个应用只运行一个实例的技术细节问题
内容:
Winamp(一种播放mp3的软件,鼎鼎大名)具有如下两个功能
1.可以只运行一个实例
2.当你双击硬盘上的扩展名为mp3的文件的时候,将自动打开Winamp播放;
但是如果有一个实例正在运行的时候,则清空当前列表,把双击的文件名
加入列表内开始播放。其中,第1个特征和第2个特征的头半部分我都能实现,只是第2个特征的
后半部分难以实现,不知道是什么原理。
我的程序的
BOOL CMyPlayerApp::InitInstance()的处理中
首先::GlobalFindAtom()查找是否已经运行,
如果存在,就return FALSE;直接结束运行的新的实例了。
如果想实现我说的那个问题的话,是不是在返回之前,发送个
WM_COPYDATA消息给已经存在的实例?
还是另有高明的办法来实现,请高人指点!

解决方案 »

  1.   

    WM_COPYDATA这个方法也可以
    只要是进城间通讯的方法都可以
      

  2.   

    创建互斥比较方便:
    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); // 退出时记得释放互斥
      

  3.   

    再说说如何接受WM_COPYDATA传过来的文件名:
    PCOPYDATASTRUCT pcds;
    TCHAR           szMp3File[256];
    .
    .
    .
    case WM_COPYDATA:
      pcds = (PCOPYDATASTRUCT)lParam;
      lstrcpyn(szMp3File,pcds->lpData,pcds->cbData);
    .
    .
    .