第二个实例启动判断一下是否已存在实例,new 一个char[255],把指针作为参数发出
SendMessage(WM_user+888,(long)pmystr,0);

解决方案 »

  1.   

    首先要让第二个实例知道第一个实例的存在. 比如通过设置一个Mutex 或者通过共享内存(直接可以传递消息的) 或者通过窗口名 或者通过窗口Prop. 等等...
    之后就可以传送数据了. 可以用两个线程交换数据的任何方式. 比如WM_COPYDATA/IPC / Share Memory /synchronization object / .....
      

  2.   

    我是同时只能让一个实例运行,
    这样发完消息就自己关闭自己, 会不会同时把new出来的一段字符串释放掉,而第一个实例又没有
    接收到呢?
      

  3.   

    我同意vcsongs(vcsongs) 的意见,通过SendMessage()函数不会出现上面提出的释放问题。
    建议参考《windows核心编程》
      

  4.   

    能不能具体说一下怎么用 Share Memory 做呢?
    //BOW
      

  5.   

    msdn2000/Platform SDK/Base Services/memory/File Mapping/About File Mapping/Sharing files and memory/...
      

  6.   

    inside Visual C++ 和 Advance Windows Program 都有介绍,可用Memory Map
    ,User Message ,COM ,DDE 方法多多。自已看看吧。 
      

  7.   

    第二个实例启动判断一下是否已存在实例,new 一片内存lpbuf作字符串,把指针作为参数发出
    SendMessage(WM_COPYDATA,(long)lpbuf,0); 
    不过没试过,
    但肯定用SendMessage(WM_user+888,(long)pmystr,0); 是不行的,那会内存访问出错
      

  8.   

    我是这样的发送的程序WM_LM_ADDING是自定义的消息
    HGLOBAL hMem = ::GlobalAlloc(GPTR, 255);
    LPVOID pMem = ::GlobalLock(hMem);
    ::memcpy(pMem, lpCmdLine, strlen(lpCmdLine));
    ::GlobalUnlock(hMem);
    ::SendMessage(hPreInstance, WM_LM_ADDING, (WPARAM)hMem, NULL);接收代码是这样的
    HGLOBAL hMem = (HGLOBAL)wParam;
    LPVOID pMem = ::GlobalLock(hMem);
    LPTSTR lpCmdLine = new CHAR[255];
    ::CopyMemory(lpCmdLine, pMem, 254);调试的时候,在接收程序中发那段内存已不是我发送程序写入的内容,这是怎么回事呀?
      

  9.   

    首先你的hPreInstance是哪来的? Win32中只是为了兼容才保留这个句柄的... 实际上根本不起作用了... 其次这样直接修改其它进程数据区的内容是要非法操作的...共享内存不是这样直接的... 看看资料再说吧.
      

  10.   

        为什么不用WM_COPYDATA消息呢?给第一个实例的主窗口句并发送一个该消息就可以了。现在的问题是第二个实例如何得到第一个实例的主窗口句柄。答案是使用共享内存段。看下面的例子:
    //在各个实例之间共享的变量
    #pragma data_seg(".shared")
    HWND     g_MainhWnd=NULL;//主程序的窗口句柄
    #pragma data_seg()
    //该句将新创建的节Shared设置成共享属性
    #pragma comment(linker,"/SECTION:.shared,rws")
    //将主窗口句柄放到共享内存段里
    CMainFrame::OnCreate(....)
    {
         CFrameWnd::OnCreate(....);     //判断是否已经有实力在运行了。
         if(g_MainhWnd)
        {
              //在这里将你的字符串用WM_COPYDATA消息发送给m_MainhWnd。
              return -1;
         }
         g_MainhWnd=m_hWnd;
         return 0;
    }
        当然了,判断是否已经有实力在运行还有别的方法。在这里我用了一个比较简单的方法。
      

  11.   

    To vcsongs:
    我的是自己定义的,用FindWindow找的
      

  12.   

    To kimo1980:你好能否留一下你的MAIL或OICQ.以便能问你
      

  13.   

    To kimo1980:
    共享内存变量能不能为CString?
      

  14.   

    to lumine:
    使用共享内存的一个充分的理由是因为一个进程不能随便的访问另一个进程的内存区.既然是这样. 你判断一下吧. 你怎么传CString? 假如传的是指针之类. 那么要通过这个指针访问内容也要访问内部的内存区的. 如果是把整个CString的内容放在共享内存里. 那么在另一侧怎么用一个CString接收呢?事实上用共享内存可以转递任何你想传的东西. 不过要有点技巧.共享内存实际上是一块在内存区中的文件. 而MFC中的序列化技术可以把类的内容序列化到文件中. 借鉴一下这个想法. 看看有没有帮助. 
      

  15.   

    To kimo1980:
    我的OICQ是4573245,希望你能加我好友
      

  16.   

    用WM_COPYDATA真实简单方便S了发送端的进程
    ~~~~~~~~~~~void SendMessageCopyData()
    {
        LPTSTR strWindowTitle = _T("Window Name");
        LPTSTR strDataToSend  = _T("要发送的字符串,可当作命令");
        
    LRESULT copyDataResult;
    CWnd *pOtherWnd = CWnd::FindWindow(NULL, strWindowTitle); if (pOtherWnd)
    {
    COPYDATASTRUCT cpd;
    cpd.dwData = 0;
    cpd.cbData = strlen(strDataToSend);
    cpd.lpData = strDataToSend;
    copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,
                                                    (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),
                                                    (LPARAM)&cpd);


    else 
    {
    AfxMessageBox("另外那个接收WM_COPYDATA的进程未打开");
                      //这里打开那个进程就可以
    }
    }
    接收端进程
    ~~~~~~~~~BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
    //{{AFX_MSG_MAP(CMyWnd)
    ...
    ON_WM_COPYDATA()
    ...
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()...BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
    {
    CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);

    return CMyWnd::OnCopyData(pWnd, pCopyDataStruct);
    }
      

  17.   

    我没有QQ。email是[email protected]。欢迎交流。