第二个实例启动判断一下是否已存在实例,new 一个char[255],把指针作为参数发出
SendMessage(WM_user+888,(long)pmystr,0);
SendMessage(WM_user+888,(long)pmystr,0);
解决方案 »
- 从JPG中,取一个矩形出来
- 如何更改alt+tab的图标
- opnegl的坐标系问题
- 看了论坛里关于send时产生WSAEWOULDBLOCK的处理,仍有疑问.
- 在VC里要使函数的返回值是一个字符串,应该怎么写,我用char* 在取值时出错
- 各位大侠,请帮忙,高分相赠!
- 小妹求救:构造函数的一种奇怪现象。
- 大家所在的公司有强调对win7、win8的支持吗?
- 谁帮我解决这个问题,我的分全给谁/*串口到TCP的问题*//*400分*/
- 任意一个*.dll文件,我怎样知道它提供了那些接口,恳请各位指点。
- 怎么显示图标?
- -------到底是自己扩展MFC还是用Comctl32.dll的特性?-------
之后就可以传送数据了. 可以用两个线程交换数据的任何方式. 比如WM_COPYDATA/IPC / Share Memory /synchronization object / .....
这样发完消息就自己关闭自己, 会不会同时把new出来的一段字符串释放掉,而第一个实例又没有
接收到呢?
建议参考《windows核心编程》
//BOW
,User Message ,COM ,DDE 方法多多。自已看看吧。
SendMessage(WM_COPYDATA,(long)lpbuf,0);
不过没试过,
但肯定用SendMessage(WM_user+888,(long)pmystr,0); 是不行的,那会内存访问出错
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);调试的时候,在接收程序中发那段内存已不是我发送程序写入的内容,这是怎么回事呀?
//在各个实例之间共享的变量
#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;
}
当然了,判断是否已经有实力在运行还有别的方法。在这里我用了一个比较简单的方法。
我的是自己定义的,用FindWindow找的
共享内存变量能不能为CString?
使用共享内存的一个充分的理由是因为一个进程不能随便的访问另一个进程的内存区.既然是这样. 你判断一下吧. 你怎么传CString? 假如传的是指针之类. 那么要通过这个指针访问内容也要访问内部的内存区的. 如果是把整个CString的内容放在共享内存里. 那么在另一侧怎么用一个CString接收呢?事实上用共享内存可以转递任何你想传的东西. 不过要有点技巧.共享内存实际上是一块在内存区中的文件. 而MFC中的序列化技术可以把类的内容序列化到文件中. 借鉴一下这个想法. 看看有没有帮助.
我的OICQ是4573245,希望你能加我好友
~~~~~~~~~~~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);
}