VC 共享内存问题 有人遇到吗 问了好多人都无法解决 内存 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 typedef struct ShareMenoryArray{ CArray <UserInfo, UserInfo&> g_ClientArray; }*LPShareMenoryArray;这哪里是神马共享内存啊,这不就是自定义结构么。共享内存只能定义基本数据类型,如下:#pragma data_seg(".Shard")LONG g_lInstanceCount = 0;#pragma data_seg()#pragma comment(linker,"/section:.Shard,rws") 少年你不懂吧。。 你这也是个办法 但你那不好用是共享段果然年纪大了眼睛不好使了,那看下面这段好了#include "StdAfx.h"#include ".\sharememory.h"ShareMemory::ShareMemory(void){ m_hMap = NULL; m_pBuffer = NULL;}ShareMemory::~ShareMemory(void){ Close();}void ShareMemory::Close(){ if( m_pBuffer ) { UnmapViewOfFile(m_pBuffer); m_pBuffer = NULL; } if( m_hMap ) { CloseHandle(m_hMap); m_hMap = NULL; }}string ShareMemory::ReadShareMemory(const WCHAR* pShareName){ string strRet = ""; do { HANDLE m_hMap = OpenFileMapping(FILE_MAP_READ, FALSE, pShareName); if(!m_hMap) { LDB1(L"OpenFileMapping failed! sharename = %s, error = %u", pShareName, GetLastError()); break; } m_pBuffer = MapViewOfFile(m_hMap,FILE_MAP_READ,0,0,0); if( !m_pBuffer ) { LDB1(L"MapViewOfFile failed! %u", GetLastError()); break; } strRet = string((char*)m_pBuffer); } while (false); return strRet;}BOOL ShareMemory::WriteShareMemory(const void* pData, int nCount, const WCHAR* pShareName){ BOOL bRet = FALSE; do { m_hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024, pShareName); if( !m_hMap) { LCF1(L"CreateFileMapping failed! sharename = %s, error = %u", pShareName, GetLastError()); break; } m_pBuffer = MapViewOfFile(m_hMap, FILE_MAP_WRITE, 0, 0, 0); if( !m_pBuffer ) { break; } memcpy(m_pBuffer, pData, nCount); bRet = TRUE; } while (false); return bRet;} 你没明白我意思 我知道简单的数据可以共享 我是像实现共享表的方式 自动增加表 所以我使用CArray#pragma pack(1)typedef struct UserInfo{ int User; int PassWord; int PlayerName; }*LPUserInfo; typedef struct ShareMenoryArray{ //CArray <UserInfo, UserInfo&> g_ClientArray; 把这里修改 UserInfo m_User[255] //固定数组对象长度 这样的方法就可以 但我想使用 CArray 的就不可以 因为不知道要几个对象啊 固定255 万一不够呢 }*LPShareMenoryArray;#pragma pack() 首先检查Mapping的API都调用成功了么(两个EXE都要检查)可能由于Windows权限问题,内存映射根本没有成功然后不建议使用C++类作为Mapping的内容,除非你能确保类中没有使用任何的指针(一个进程的指针在另一个进程中无效),自己想想为什么CArray类能自动增长数组长度?他内部调用了malloc之类的本地内存分配函数,使得缓冲区增大,也就是CArray一定使用了本地指针你实际的数据保存在malloc得到的非共享的内存中,在共享内存里只是CArray本身的数据 有关WTL工程使用了Boost后Release编译不通过的问题 调用弹出对话框中输入的内容有误,谢谢! 热烈庆祝VC江湖群14109592改版开放。高手如云,不加后悔!加之前请说明技术水平层次。在哪地方工作。谢谢。天天在线! 用控制台起ftp服务,但OnAccept()函数没有响应的问题 一个简单的问题(在线) 请教如何制作安装盘!急 为什么要做这件事??加分~~~~~ vc++用ado使用游标? 如何实现listctrl双击空白行可输入数据? 关于WINDOWPLACEMENT结构 请教大家 怎样获取窗口的标题? windows ap如何i调用Cult3D插件的接口函数
{
CArray <UserInfo, UserInfo&> g_ClientArray;
}*LPShareMenoryArray;这哪里是神马共享内存啊,这不就是自定义结构么。共享内存只能定义基本数据类型,如下:
#pragma data_seg(".Shard")
LONG g_lInstanceCount = 0;
#pragma data_seg()
#pragma comment(linker,"/section:.Shard,rws")
少年你不懂吧。。 你这也是个办法 但你那不好用是共享段果然年纪大了眼睛不好使了,那看下面这段好了
#include "StdAfx.h"
#include ".\sharememory.h"ShareMemory::ShareMemory(void)
{
m_hMap = NULL;
m_pBuffer = NULL;
}ShareMemory::~ShareMemory(void)
{
Close();
}
void ShareMemory::Close()
{ if( m_pBuffer )
{
UnmapViewOfFile(m_pBuffer); m_pBuffer = NULL;
} if( m_hMap )
{
CloseHandle(m_hMap); m_hMap = NULL;
}
}string ShareMemory::ReadShareMemory(const WCHAR* pShareName)
{
string strRet = ""; do
{
HANDLE m_hMap = OpenFileMapping(FILE_MAP_READ, FALSE, pShareName); if(!m_hMap)
{
LDB1(L"OpenFileMapping failed! sharename = %s, error = %u", pShareName, GetLastError());
break;
} m_pBuffer = MapViewOfFile(m_hMap,FILE_MAP_READ,0,0,0); if( !m_pBuffer )
{
LDB1(L"MapViewOfFile failed! %u", GetLastError());
break;
} strRet = string((char*)m_pBuffer); } while (false); return strRet;}BOOL ShareMemory::WriteShareMemory(const void* pData, int nCount, const WCHAR* pShareName)
{
BOOL bRet = FALSE; do
{ m_hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024, pShareName); if( !m_hMap)
{
LCF1(L"CreateFileMapping failed! sharename = %s, error = %u", pShareName, GetLastError());
break;
} m_pBuffer = MapViewOfFile(m_hMap, FILE_MAP_WRITE, 0, 0, 0); if( !m_pBuffer )
{
break;
} memcpy(m_pBuffer, pData, nCount); bRet = TRUE; } while (false); return bRet;
}
typedef struct UserInfo
{
int User;
int PassWord;
int PlayerName;
}*LPUserInfo;
typedef struct ShareMenoryArray
{
//CArray <UserInfo, UserInfo&> g_ClientArray; 把这里修改
UserInfo m_User[255] //固定数组对象长度 这样的方法就可以 但我想使用 CArray 的就不可以 因为不知道要几个对象啊 固定255 万一不够呢
}*LPShareMenoryArray;
#pragma pack()
可能由于Windows权限问题,内存映射根本没有成功然后不建议使用C++类作为Mapping的内容,除非你能确保类中没有使用任何的指针(一个进程的指针在另一个进程中无效),
自己想想为什么CArray类能自动增长数组长度?他内部调用了malloc之类的本地内存分配函数,使得缓冲区增大,也就是CArray一定使用了本地指针
你实际的数据保存在malloc得到的非共享的内存中,在共享内存里只是CArray本身的数据