blog

枪手亨利

博客园 首页 新随笔 联系 订阅 管理
由于需要,我要将一个数据库文件映射为内存映射文件,在映射好之后,我会得到该映射文件的首地址,代码如下:
   void CMDBDlg::OnMapFile() 
   {
      // open file
      hFile = ::CreateFile("E:\\table1.dbf", GENERIC_READ | GENERIC_WRITE, 
            FILE_SHARE_READ| FILE_SHARE_WRITE, NULL, 
            OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

      if(hFile == INVALID_HANDLE_VALUE)
      {
         TRACE("failed to open file!");
         return;
      }
      dwFileSize = ::GetFileSize(hFile, NULL);
      // create a mapping file
      hMapFile = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwFileSize, NULL);
      if(hMapFile == NULL)
      {
            TRACE("create the mapping file failed!");
            ::CloseHandle(hFile);
            return;
      }

      // create the views of file
      pFile = ::MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 0);
      if(pFile == NULL)
      {
            TRACE("mapping the views of file failed!");
            ::CloseHandle(hFile);
            ::CloseHandle(hMapFile);
            return;
      }
}

      我想知道的问题就是我虽然得到了该映射文件的首地址pFile,但是我如何使用该指针来操作被映射到内存映射文件的数据呢?各位出出招把!!!!我实在没办法了!!

可以参考下面的文章:
// ShareMem.h: interface for the CShareMem class.
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SHAREMEM_H__DC737B1E_1A7A_427E_8852_A7E98F696F05__INCLUDED_)
#define AFX_SHAREMEM_H__DC737B1E_1A7A_427E_8852_A7E98F696F05__INCLUDED_
#if _MSC_VER  1000
   #pragma once
#endif

// _MSC_VER  1000

class CShareMem
{
      public:
      CShareMem();
      CShareMem(int cCount,size_t cSize);
      virtual ~CShareMem();
      BOOL InitializeMem(int cCount,size_t cSize );
      size_t GetDataSize()
       {
            return m_cDataSize;
      };
      int GetDataCount() 
      {
            return m_cDataCount;
      };
      BOOL Clear() ;
      BOOL Lock(DWORD dwMilliSeconds = INFINITE);
      BOOL Unlock();
      LPVOID GetData(int nIndex = 0);
      BOOL GetData(int nIndex ,LPVOID lpvData,size_t cSize);
      BOOL AddData(LPVOID lpvData,size_t cSize);
      BOOL SetData(int nIndex ,LPVOID lpvData,size_t cSize);
      BOOL Delete(int nIndex );

      protected:
      LPVOID  m_lpvData ; //数据指针
      size_t  m_cDataSize ; //数据元素大小(BYTE)   
      int   m_cDataCount; //数据元素个数
      BOOL  m_fInit;//是否初始化成功
      HANDLE  m_hMutant;//互斥量
      HANDLE  m_hSharedMemoryFile;//共享内存核心文件句柄
      CString  m_strMutantName;//互斥量名字
      CString  m_strShareMemName;//共享内存区域名字
      BOOL  m_fExist ;//是否已存在
};
#endif // !defined// ShareMem.cpp: implementation of the CShareMem class.

//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ShareMem.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CShareMem::CShareMem()
{
      m_cDataCount = 0;
 m_cDataSize = 0;
 m_fInit = FALSE;
 m_fExist = FALSE;
 m_lpvData = NULL;
 m_hSharedMemoryFile = NULL;
 m_strMutantName = L"ShareMemMutant";
 m_strShareMemName = L"ShareMemSection";
}
//清除所有共享内存区域的数据
BOOL CShareMem::Clear()
{
 try
 {
  memset((PBYTE)m_lpvData,0,m_cDataSize*m_cDataCount);
  return TRUE;
 }
 catch(...)
 {
  return FALSE;
 }
}
CShareMem::~CShareMem()
{
 if (m_fInit) //
 {
  UnmapViewOfFile(m_lpvData);
  CloseHandle(m_hSharedMemoryFile);
 }
}
CShareMem::CShareMem(int cCount,size_t cSize)
{
 m_cDataCount = cCount;
 m_cDataSize = cSize;
 m_fInit = FALSE;
 m_lpvData = NULL;
 m_hSharedMemoryFile = NULL;
 m_fExist = FALSE;
 m_strMutantName = L"ShareMemMutant";
 m_strShareMemName = L"ShareMemSection";
}
//取得nIndex位置上的数据指针
LPVOID CShareMem::GetData(int nIndex )
{
 if (m_fInit)
 {
  if (nIndex < 0 || nIndex >= m_cDataCount)
   return NULL;
  return (PBYTE)m_lpvData + nIndex * m_cDataSize;
 }
 else
 {
  return NULL;
 }
}
//取得nIndex位置上的数据
BOOL CShareMem::GetData(int nIndex,LPVOID lpvData,size_t cSize)
{
 if (m_fInit)
 {
  if (nIndex < 0 || nIndex >= m_cDataCount)
   return FALSE;
  if (cSize != m_cDataSize )
  {
   return FALSE;
  }
  memcpy(lpvData,(PBYTE)m_lpvData + nIndex * m_cDataSize,cSize);
  return TRUE;
 }
 else
 {
  return FALSE;
 }
}
//删除 nIndex位置的数据
BOOL CShareMem::Delete(int nIndex)
{
 if (m_fInit)
 {
  if (nIndex < 0 || nIndex >= m_cDataCount)
   return FALSE;
  int nLeft = m_cDataCount - nIndex - 1;
  PBYTE pbBuff = new BYTE[nLeft * m_cDataSize];
  if (0== nIndex ) //删除头
  {
   memcpy(pbBuff,(PBYTE)m_lpvData + m_cDataSize ,(m_cDataCount -1)*m_cDataSize);
   memset(m_lpvData,0,m_cDataCount * m_cDataSize);
   memcpy(m_lpvData,pbBuff,(m_cDataCount -1)*m_cDataSize);
  }
  else if ((m_cDataCount -1) == nIndex ) //删除尾
  {
   memset((PBYTE)m_lpvData + (nIndex *m_cDataSize),0 ,m_cDataSize);
  }
  else
  {
   memcpy(pbBuff,(PBYTE)m_lpvData + (nIndex + 1)*m_cDataSize,nLeft * m_cDataSize);
   memset((PBYTE)m_lpvData + (nIndex  )*m_cDataSize,0,(m_cDataCount - nIndex) * m_cDataSize);
   memcpy((PBYTE)m_lpvData + (nIndex )*m_cDataSize,pbBuff,nLeft *m_cDataSize);
  }
  delete [] pbBuff;
  m_cDataCount --;
  return TRUE;
 }
 else
 {
  return FALSE;
 }
}
//添加数据到数据尾
BOOL CShareMem::AddData(LPVOID lpvData,size_t cSize)
{
 try
 {
  //
  if ((m_cDataSize!= 0 && m_cDataSize != cSize))
  {
   return FALSE;
  }
  if (!m_fInit)
  {
   return FALSE;
  }
  //
  //if (m_cDataCount == 0)
  memcpy((PBYTE)m_lpvData + (m_cDataCount )*m_cDataSize, lpvData,cSize);
  m_cDataCount ++ ;
  return TRUE;
 }
 catch(CMemoryException *memE)
 {
  memE->ReportError();
  memE->Delete();
  return FALSE;
 }
 catch(...)
 {
  return FALSE;
 }
}
//设置nIndex位置上的数据
BOOL CShareMem::SetData(int nIndex,LPVOID lpvData,size_t cSize)
{
 if (m_fInit)
 {
  if (nIndex < 0 || nIndex >= m_cDataCount)
   return FALSE;
  if (m_cDataSize != cSize)
  {
   TRACE(_T("数据大小不匹配!!!\n"));
   return FALSE;
  }
  memset((PBYTE)m_lpvData + nIndex * m_cDataSize,0,cSize);
  memcpy((PBYTE)m_lpvData + nIndex * m_cDataSize,lpvData,cSize);
  return TRUE;
 }
 else
 {
  return FALSE;
 }
}
//初始化 共享内存和各个变量
BOOL CShareMem::InitializeMem(int cCount,size_t cSize)
{
 m_hMutant = CreateMutex(NULL,FALSE,m_strMutantName);
 m_cDataSize = cSize;
 m_cDataCount = cCount;
 
 //创建一内存映射文件,设定共享内存区域
 m_hSharedMemoryFile = ::CreateFileMapping(
                  (HANDLE)0xFFFFFFFF,  // 文件句柄
                        NULL,                // 安全属性(WIN95忽略)
                        PAGE_READWRITE,      // 文件的保护属性
                        0,                   // 使用页面文件
                        1<<16,               // 共享内存大小
      m_strShareMemName.GetBuffer(0));// 共享内存名称

 if(m_hSharedMemoryFile == NULL)
 {
  m_fExist = FALSE;
  m_fInit = FALSE;
  return FALSE;
 }
 else
 {
  if(GetLastError() == ERROR_ALREADY_EXISTS)
   m_fExist = TRUE;
 }
 m_lpvData = ::MapViewOfFile(
                        m_hSharedMemoryFile,        // 核心对象的文件HANDLE
                        FILE_MAP_ALL_ACCESS, // Read/Write
                        0,                  // 使用页面文件
                        0,                  // 映射整个共享内存区域
                        0);                 // 映射整个空间
 if(m_lpvData == NULL)
 {
  m_fInit = FALSE;
  CloseHandle(m_hSharedMemoryFile);
  return FALSE;
 }
 else
  m_fInit = TRUE;
 return TRUE; 
}
//互斥锁定共享内存
BOOL CShareMem::Lock(DWORD dwMilliSeconds )
{
 if( WaitForSingleObject(m_hMutant,dwMilliSeconds) == WAIT_OBJECT_0)
  return TRUE;
 return FALSE;
}
//互斥解锁共享内存
BOOL CShareMem::Unlock()
{
 return ReleaseMutex(m_hMutant);
}

实在不好意思!开始有个地方有点小错误!:)

memcpy(pbBuff,(PBYTE)m_lpvData + (nIndex + 1)*m_cDataSize,nLeft * m_cDataSize);

 memset((PBYTE)m_lpvData + (nIndex +1 )*m_cDataSize,0,(m_cDataCount - nIndex) * m_cDataSize);

memcpy((PBYTE)m_lpvData + (nIndex +1 )*m_cDataSize,pbBuff,nLeft *m_cDataSize); 改为:

 memcpy(pbBuff,(PBYTE)m_lpvData + (nIndex + 1)*m_cDataSize,nLeft * m_cDataSize);

memset((PBYTE)m_lpvData + (nIndex )*m_cDataSize,0,(m_cDataCount - nIndex) * m_cDataSize);

memcpy((PBYTE)m_lpvData + (nIndex )*m_cDataSize,pbBuff,nLeft *m_cDataSize); 一不小心就复制了!

现在的是重新修改后的,望大家见谅!!:)这个类可以方便的进行数据添加,删除!!建议大家使用时将它作为CWinApp派生子类的public成员变量,这样就可以方便的在工程的任何地方调用了!希望对大家有用!:)


相关文章
posted on 2005-11-05 09:58  henry  阅读(776)  评论(0编辑  收藏  举报