两个进程通信,进程1有个函数是void fun(int* p),其中p是out输出的。
进程1把进程1中p的地址发送给进程2。
进程2得到地址后改变这个地址的值。问题到了:
我就想实现进程2改变的这个值,进程1可以得到。也就是进程1和进程2用了同样的逻辑地址和物理地址。能实现吗?
下面的可以吗,应该不行,有方法吗
HANDLE hFileMap;
hFileMap = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0, ShareMemory,MAP_FILE_NAME );
if ( hFileMap == NULL )
return;
LPVOID lpMap;
lpMap = MapViewOfFile( hFileMap,FILE_MAP_ALL_ACCESS,0, 0,ShareMemory );
if ( lpMap == NULL )
{
CloseHandle( hFileMap );
return;
}
memset( lpMap, 0, ShareMemory );
SHARE_DATA * pData = (SHARE_DATA*)lpMap;
pData->time=1;
lstrcpy( LPTSTR(pData->str), "Map Suc!!!" );
进程1把进程1中p的地址发送给进程2。
进程2得到地址后改变这个地址的值。问题到了:
我就想实现进程2改变的这个值,进程1可以得到。也就是进程1和进程2用了同样的逻辑地址和物理地址。能实现吗?
下面的可以吗,应该不行,有方法吗
HANDLE hFileMap;
hFileMap = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0, ShareMemory,MAP_FILE_NAME );
if ( hFileMap == NULL )
return;
LPVOID lpMap;
lpMap = MapViewOfFile( hFileMap,FILE_MAP_ALL_ACCESS,0, 0,ShareMemory );
if ( lpMap == NULL )
{
CloseHandle( hFileMap );
return;
}
memset( lpMap, 0, ShareMemory );
SHARE_DATA * pData = (SHARE_DATA*)lpMap;
pData->time=1;
lstrcpy( LPTSTR(pData->str), "Map Suc!!!" );
指针指向的地址只是在进程1中有效,在进程2种是无效的,进程1的指针到了进程2中是不能用的。
如果要改变的话,只能是进程2把数据拷贝到共享内存中,进程1取出后自行改变pData
问下,LZ是想做跨进程通信么?
那样的话,不一定非得用共享数据段哦,使用DDE和利用剪切板应该也能实现。相对来说剪切板最简单一些(相对的,可能对用户操作产生一定影响)。
不过共享数据段也不太难搞啦。
DDE没用过,没有发言权。
有方法,假设AB两程序,A有数据100Byte给B
1。a找b
2。在a里用b的句柄virtualMallocEx一块空间,写进去数据
3。用b的句柄给b发消息,把申请空间的地址传给b
4。b获得地址和长度后,自己读自己内存就得到数据了
只不过你没有深层次的看CreateFileMapping的用法,楼主,你看看MSDN对于CreateFileMapping的详细说明,说明的最下面有代码例子,名字是Creating Named Shared Memory。这个例子正好就是你想要的
http://perfecter.blog.xdnice.com
抱歉,上班的时候只能上CSDN这些网站,不能给你找具体的页面链接
大哥你很强悍啊,但是进程a其实是dll,而进程b是服务,而调用dll的客户的应用程序,这个句柄我们不好获得啊