这段时间在做东西的时候,需要实现两个控制台程序间频繁交互数据,就想到了内存映射的方法。结果Server端的内存地址一直无法传到client端。代码如下。请各位帮忙看看,谢谢:
Server端:
CSFMServer::CSFMServer()
{
_Init();
//
CString  file_name,map_name;
char     file_name_buf[100];
char     map_name_buf[100]; file_name="CIMAGE_DATA_SERVER";
map_name="_CIMAGE_MAP_OBJ";
sprintf(file_name_buf,"%s",file_name);
sprintf(map_name_buf,"%s" ,map_name); Create(file_name_buf, map_name_buf,1024*1024*7);//创建7M共享内存区
// 参数1:NULL或指定的文件(将创建或打开并读写/麻烦) DEFAULT_FILENAME   NULL
// 参数2:要创建的共享内存对象名                    DEFAULT_MAPNAME    "_SFM_OBJ_"
// 参数3:要创建的共享内存对象大小                  DEFAULT_MAPSIZE    (0xFFFF + 1)
}void CSFMServer::Create(char *szFileName, char *szMapName, DWORD dwSize)
{
if (m_iCreateFlag)
{
_Destory();
} if (szFileName) m_pFileName = _strdup(szFileName);
                    //else m_pFileName = NULL; if (szMapName)
{
m_pMapName = _strdup(szMapName);
}else
{
m_pMapName = _strdup(DEFAULT_MAPNAME);
} if (dwSize > 0)
{
m_dwSize = dwSize;
}else 
{
m_dwSize = DEFAULT_MAPSIZE;
} if (m_pFileName)
{
// file
m_hFile = CreateFile(
m_pFileName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,//OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
}else
{
// system
m_hFile = (HANDLE)0xFFFFFFFF;
} if (m_hFile)
{
m_hFileMap = CreateFileMapping(
m_hFile,
NULL,
PAGE_READWRITE,
0,
m_dwSize,
m_pMapName
); //使只有一个CSFMServer对象能操作内存对象
//if (m_hFileMap != NULL && ERROR_ALREADY_EXISTS == GetLastError())
//{
// CloseHandle(m_hFileMap);
// m_hFileMap = NULL;
//}
} if (m_hFileMap)
{
m_lpFileMapBuffer = MapViewOfFile(
m_hFileMap,
FILE_MAP_ALL_ACCESS,//FILE_MAP_WRITE|FILE_MAP_READ,
0,
0,
m_dwSize
);
} m_iCreateFlag = 1;
}Client端:
CSFMClient::CSFMClient()
{
_Init();
//
CString  file_name,map_name;
char     map_name_buf[100] = "_CIMAGE_MAP_OBJ"; //map_name="_CMAXI_MAP_OBJ";
//sprintf(map_name_buf,"%s" ,map_name); Open(FILE_MAP_READ|FILE_MAP_WRITE, map_name_buf);
}void CSFMClient::Open(DWORD dwAccess, char *szMapName)
{// 参数1:共享内存对象访问方式(FILE_MAP_READ|FILE_MAP_WRITE)
 // 参数2:共享内存对象名 if (m_iOpenFlag) _Destory(); if (szMapName)
{
m_pMapName = _strdup(szMapName);
}else 
{
m_pMapName = _strdup(DEFAULT_MAPNAME);
} m_hFileMap = OpenFileMapping(
dwAccess,
NULL,
(LPCWSTR)m_pMapName
); if (m_hFileMap)
{
m_lpFileMapBuffer = MapViewOfFile(
m_hFileMap,
dwAccess,
0,
0,
0
);
} m_iOpenFlag = 1;
}发现单步执行到client端红色标记位时,获得的地址为空,但是我之前确实在server中写入的共享地址了,请各位大牛帮忙分析下,谢谢

解决方案 »

  1.   

    在你的createfile,createfilemapping, openfilemapping等函数后都调用getlasterror看看 返回值吧。或许可以找出原因
      

  2.   

    fsfds
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://feiyun0112.cnblogs.com/
      

  3.   

    我倒是看出点错误
    (LPCWSTR)m_pMapName
    其中的 m_pMapName 是 ANSI 串,这样是不行的
    如果你要把他转成 WCHAR,应该这样:
    (LPCWSTR)CStringW(m_pMapName)