向另一个实例发消息?

知行职场-雷曼 2001-07-19 10:19:20
我想做一个另似Winamp的播放器
在资源管理器中双击文件可以打开的播放器.
现在我是同时只能一个实例在运行,
如果已有实例在运行, 再双击媒体文件时,则向原实例发一个
加入文件的消息.
现在的问题是怎么发一个带有字符串的消息?

...全文
293 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
OK
kimo1980 2001-07-24
  • 打赏
  • 举报
回复
我没有QQ。email是kimo1980@163.com。欢迎交流。
s6283 2001-07-24
  • 打赏
  • 举报
回复
如果第二个实例是一个后台程序,不知道大家有什么办法?
  • 打赏
  • 举报
回复
大虾这么多,看来分还不够
我再给加20分吧
  • 打赏
  • 举报
回复
To all:
我搞定了,3x
111222 2001-07-23
  • 打赏
  • 举报
回复
用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);
}

  • 打赏
  • 举报
回复
To kimo1980:
我的OICQ是4573245,希望你能加我好友
vcsongs 2001-07-22
  • 打赏
  • 举报
回复
to lumine:
使用共享内存的一个充分的理由是因为一个进程不能随便的访问另一个进程的内存区.

既然是这样. 你判断一下吧.

你怎么传CString? 假如传的是指针之类. 那么要通过这个指针访问内容也要访问内部的内存区的. 如果是把整个CString的内容放在共享内存里. 那么在另一侧怎么用一个CString接收呢?

事实上用共享内存可以转递任何你想传的东西. 不过要有点技巧.

共享内存实际上是一块在内存区中的文件. 而MFC中的序列化技术可以把类的内容序列化到文件中. 借鉴一下这个想法. 看看有没有帮助.
  • 打赏
  • 举报
回复
To kimo1980:
共享内存变量能不能为CString?

sunyanbiao_12 2001-07-22
  • 打赏
  • 举报
回复
用一个动态连接库,应该能解决问题。
  • 打赏
  • 举报
回复
To kimo1980:

你好能否留一下你的MAIL或OICQ.以便能问你
kimo1980 2001-07-21
  • 打赏
  • 举报
回复
为什么不试一下我的方法呢?
  • 打赏
  • 举报
回复
To vcsongs:
我的是自己定义的,用FindWindow找的
不解 2001-07-19
  • 打赏
  • 举报
回复
我同意vcsongs(vcsongs) 的意见,通过SendMessage()函数不会出现上面提出的释放问题。
建议参考《windows核心编程》
  • 打赏
  • 举报
回复
我是同时只能让一个实例运行,
这样发完消息就自己关闭自己, 会不会同时把new出来的一段字符串释放掉,而第一个实例又没有
接收到呢?
vcsongs 2001-07-19
  • 打赏
  • 举报
回复
首先要让第二个实例知道第一个实例的存在. 比如通过设置一个Mutex 或者通过共享内存(直接可以传递消息的) 或者通过窗口名 或者通过窗口Prop. 等等...
之后就可以传送数据了. 可以用两个线程交换数据的任何方式. 比如WM_COPYDATA/IPC / Share Memory /synchronization object / .....
qin_wei 2001-07-19
  • 打赏
  • 举报
回复
烤好了
red_eyes 2001-07-19
  • 打赏
  • 举报
回复
毛蛋考好了没有?
qin_wei 2001-07-19
  • 打赏
  • 举报
回复
第二个实例启动判断一下是否已存在实例,new 一个char[255],把指针作为参数发出
SendMessage(WM_user+888,(long)pmystr,0);
kimo1980 2001-07-19
  • 打赏
  • 举报
回复
为什么不用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;
}


当然了,判断是否已经有实力在运行还有别的方法。在这里我用了一个比较简单的方法。
加载更多回复(9)

16,471

社区成员

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

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

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