用FileMapping进行通讯

class CMemMapChannel

{

public:

 

#define CMemMapChannel_MAX_DATA_SIZE   4096

 

    typedef struct _MAP_DATA

    {

       DWORD      dwSize;

       CHAR       m_szBuf[CMemMapChannel_MAX_DATA_SIZE];

    }MAP_DATA, * PMAP_DATA;

 

 

    CMemMapChannel(CHAR *pChannelName = NULL);

    virtual ~CMemMapChannel();

 

 

    DWORD  Read(VOID *pData, DWORD dwSize);

    DWORD  Write(VOID *pData, DWORD dwSize = 0);

 

 

    HANDLE        m_MutexLock;

    HANDLE        m_DataMap;

    PMAP_DATA     m_pData;

 

};

 

/

//     class  CMemMapChannel

/

 

 

 

 

CMemMapChannel::CMemMapChannel(CHAR *pChannelName)

{

    CHAR       szMutexName[1024];

    CHAR       szFileMapName[1024];

 

    if(pChannelName == NULL)

       pChannelName = "NULL";

 

    sprintf(szMutexName, "Global//CMemMapChannel_Mutex_%s", pChannelName);

    sprintf(szFileMapName, "Global//CMemMapChannel_FileMap_%s", pChannelName);

 

    m_MutexLock = CreateMutexA(NULL, FALSE, szMutexName);

    if(m_MutexLock == NULL)

    {

       assert(FALSE);

    }

 

    m_DataMap = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL,

       PAGE_READWRITE, 0, sizeof(MAP_DATA), szFileMapName);

    if(m_DataMap == NULL)

    {

       assert(FALSE);

    }

 

    m_pData = (PMAP_DATA)MapViewOfFile(m_DataMap, FILE_MAP_WRITE, 0, 0, sizeof(MAP_DATA));

    m_pData->dwSize = 0;

}

 

 

CMemMapChannel::~CMemMapChannel()

{

    if(m_pData)

       UnmapViewOfFile(m_pData);

 

    if(m_DataMap)

       CloseHandle(m_DataMap);

 

    if(m_MutexLock)

       CloseHandle(m_MutexLock);

}

 

 

DWORD  CMemMapChannel::Read(VOID *pData, DWORD dwSize)

{

    DWORD         dwRetVal;

    DWORD         dwReadSize;

 

    dwRetVal = WaitForSingleObject(m_MutexLock, INFINITE);

    if(dwRetVal != WAIT_OBJECT_0 &&

       dwRetVal != ERROR_WAIT_NO_CHILDREN)

       return -1;

 

    if(m_pData->dwSize == 0)

    {

       ReleaseMutex(m_MutexLock);

       return 0;

    }

 

    if(m_pData->dwSize > dwSize)

    {

       ReleaseMutex(m_MutexLock);

       return 0;

    }

 

 

    dwReadSize = m_pData->dwSize;

    memcpy(pData, m_pData->m_szBuf, dwReadSize);

    m_pData->dwSize = 0;

 

    ReleaseMutex(m_MutexLock);

    return dwReadSize;

}

 

 

DWORD  CMemMapChannel::Write(VOID *pData, DWORD dwSize)

{

    DWORD         dwRetVal;

    DWORD         dwWriteSize;

 

    dwRetVal = WaitForSingleObject(m_MutexLock, INFINITE);

    if(dwRetVal != WAIT_OBJECT_0 &&

       dwRetVal != ERROR_WAIT_NO_CHILDREN)

       return -1;

 

    if(dwSize == 0)

       dwSize = (DWORD)strlen((CHAR *)pData)+1;

 

    if(m_pData->dwSize != 0)

    {

       ReleaseMutex(m_MutexLock);

       return 0;

    }

 

    if(dwSize > CMemMapChannel_MAX_DATA_SIZE)

    {

       ReleaseMutex(m_MutexLock);

       return 0;

    }

 

 

    dwWriteSize = dwSize;

    memcpy(m_pData->m_szBuf, pData, dwSize);

    m_pData->dwSize = dwSize;

 

    ReleaseMutex(m_MutexLock);

    return dwWriteSize;

}

好的,您想了解如何从Filemapping中读取数据并使用CreateFile函数写入文件。首先,需要使用CreateFileMapping函数创建一个文件映射对象,将文件映射到进程的地址空间中。然后使用MapViewOfFile函数将文件映射到进程的地址空间中并返回指向该区域的指针。接下来,您可以使用指针访问文件映射中的数据。最后,使用CreateFile函数创建一个新文件或打开已存在的文件,并使用WriteFile函数将数据写入该文件。 以下是一个简单的示例代码,展示如何实现从Filemapping中读取数据并使用CreateFile函数写入文件: ``` HANDLE hFile = CreateFile("output.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("Error creating file. Error code: %d\n", GetLastError()); return; } HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, "MyFileMap"); if (hMapFile == NULL) { printf("Error creating file mapping. Error code: %d\n", GetLastError()); CloseHandle(hFile); return; } LPVOID lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 1024); if (lpMapAddress == NULL) { printf("Error mapping view of file. Error code: %d\n", GetLastError()); CloseHandle(hMapFile); CloseHandle(hFile); return; } DWORD dwBytesWritten; if (!WriteFile(hFile, lpMapAddress, 1024, &dwBytesWritten, NULL)) { printf("Error writing file. Error code: %d\n", GetLastError()); } UnmapViewOfFile(lpMapAddress); CloseHandle(hMapFile); CloseHandle(hFile); ``` 注意:此示例代码仅供参考,您需要根据自己的需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值