高分求救:用CreateFileMapping共享内存中的一个数据结构有关问题
高分求救:用CreateFileMapping共享内存中的一个数据结构问题
共享内存:
m_hMapObject=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,
PAGE_READWRITE, 0, 0x1000, _TEXT( "shared_memory "));
m_pSMapView=(m_MapView_Struct *)MapViewOfFile
(m_hMapObject,FILE_MAP_WRITE, 0, 0,0);
共享的数据结构如下:
struct m_MapView_Struct{
char m_c;
int m_iMapView;
char* m_pszMapView;
char* m_pszMapView2;
}* m_pSMapView;
发送进程里如下分配:
m_pSMapView-> m_iMapView = 13628;
m_pSMapView-> m_c = '* ';
char *stmp1 = "m_pszMapView1 ";
m_pSMapView-> m_pszMapView = stmp1;
(char *)(m_pSMapView-> m_pszMapView2) = "m_pszMapView2 ";
结果
接收进程能读取到int型和char型,但是两个char*型的字符串都得不到。
我现在想结构里也共享字符串,正确的应该怎么定义呢?
------解决方案--------------------
#define MAX_BUFFER_SIZE (100)
struct m_MapView_Struct{
char m_c;
int m_iMapView;
char m_pszMapView[MAX_BUFFER_SIZE];
char m_pszMapView2[MAX_BUFFER_SIZE];
}* m_pSMapView;
lstrcpy(m_pSMapView-> m_pszMapView, "m_pszMapView1 ");
lstrcpy(m_pSMapView-> m_pszMapView2, "m_pszMapView2 ");
------解决方案--------------------
如果定义成char *, 跨进程无法共享。
------解决方案--------------------
你可以把字符串就放在共享内存中,指针指向共享内存内部(用偏移量代替)。注意:char*这样的只是指针,指向进程内地址,不同进程之间含义不同。
------解决方案--------------------
chehw(chehw) 正解
既然要共享数据,肯定要把数据复制到共享空间,别人才能访问。
因为你是要在不同进程中共享数据。
------解决方案--------------------
chehw(chehw) + Mackz(在相互)
正解
------解决方案--------------------
呵呵,,,,
------解决方案--------------------
你也可以在共享内存里面存全局内存句柄,不过速度慢些
------解决方案--------------------
GlobalAlloc
------解决方案--------------------
你的结构里面有指针,不能传送过去。
你可以考虑这样定义结构:
struct{
...
int nDataLen;
char *pData;
...
}
到时候
char *pStr = _T( "test string ");
a.nDataLen = strlen(pStr);
a.pData = new char[a.nDataLen];
memset(a.pData, 0, sizeof(char) * a.nDataLen);
strcpy(a.pData, pStr);
传输完成之后,需要释放空间,麻烦一点。
总之呢,就是指针不能把指针给过去,要给数据。
共享内存:
m_hMapObject=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,
PAGE_READWRITE, 0, 0x1000, _TEXT( "shared_memory "));
m_pSMapView=(m_MapView_Struct *)MapViewOfFile
(m_hMapObject,FILE_MAP_WRITE, 0, 0,0);
共享的数据结构如下:
struct m_MapView_Struct{
char m_c;
int m_iMapView;
char* m_pszMapView;
char* m_pszMapView2;
}* m_pSMapView;
发送进程里如下分配:
m_pSMapView-> m_iMapView = 13628;
m_pSMapView-> m_c = '* ';
char *stmp1 = "m_pszMapView1 ";
m_pSMapView-> m_pszMapView = stmp1;
(char *)(m_pSMapView-> m_pszMapView2) = "m_pszMapView2 ";
结果
接收进程能读取到int型和char型,但是两个char*型的字符串都得不到。
我现在想结构里也共享字符串,正确的应该怎么定义呢?
------解决方案--------------------
#define MAX_BUFFER_SIZE (100)
struct m_MapView_Struct{
char m_c;
int m_iMapView;
char m_pszMapView[MAX_BUFFER_SIZE];
char m_pszMapView2[MAX_BUFFER_SIZE];
}* m_pSMapView;
lstrcpy(m_pSMapView-> m_pszMapView, "m_pszMapView1 ");
lstrcpy(m_pSMapView-> m_pszMapView2, "m_pszMapView2 ");
------解决方案--------------------
如果定义成char *, 跨进程无法共享。
------解决方案--------------------
你可以把字符串就放在共享内存中,指针指向共享内存内部(用偏移量代替)。注意:char*这样的只是指针,指向进程内地址,不同进程之间含义不同。
------解决方案--------------------
chehw(chehw) 正解
既然要共享数据,肯定要把数据复制到共享空间,别人才能访问。
因为你是要在不同进程中共享数据。
------解决方案--------------------
chehw(chehw) + Mackz(在相互)
正解
------解决方案--------------------
呵呵,,,,
------解决方案--------------------
你也可以在共享内存里面存全局内存句柄,不过速度慢些
------解决方案--------------------
GlobalAlloc
------解决方案--------------------
你的结构里面有指针,不能传送过去。
你可以考虑这样定义结构:
struct{
...
int nDataLen;
char *pData;
...
}
到时候
char *pStr = _T( "test string ");
a.nDataLen = strlen(pStr);
a.pData = new char[a.nDataLen];
memset(a.pData, 0, sizeof(char) * a.nDataLen);
strcpy(a.pData, pStr);
传输完成之后,需要释放空间,麻烦一点。
总之呢,就是指针不能把指针给过去,要给数据。