level 6
风炙火舞
楼主
// ShareMemory.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#define BufferSize 1024 * 1024
#define FileSize (BufferSize + sizeof(DWORD) * 3)
typedef struct
{
DWORD dwWritePos;
DWORD dwReadPos;
DWORD dwEndTag;
BYTE bData[BufferSize];
}ShareMemory;
HANDLE hShare = NULL;
HANDLE hEvent = NULL;
ShareMemory * pShare = NULL;
void __dec
lsp
ec(dllexport) StopShare()
{
if (pShare && hEvent)
{
pShare->dwEndTag = 1;
::SetEvent(hEvent);
::Sleep(10);
::WaitForSingleObject(hEvent, 512);
}
if (hEvent)
{
CloseHandle(hEvent);
hEvent = NULL;
}
if (pShare)
{
UnmapViewOfFile(pShare);
pShare = NULL;
}
if (hShare)
{
CloseHandle(hShare);
hShare = NULL;
}
}
bool __declspec(dllexport) StartShare(LPCSTR pShareName)
{
hShare = OpenFileMappingA(FILE_MAP_ALL_ACCESS, false, pShareName);
if (!hShare)
{
hShare = CreateFileMappingA(
INVALID_HANDLE_VALUE, // system paging file
NULL, // security attributes
PAGE_READWRITE, // protection
0, // high-order DWORD of size
FileSize, // low-order DWORD of size
pShareName); // name
if (!hShare)
goto FAILE;
}
pShare = (ShareMemory *)MapViewOfFile(
hShare, // handle to file-mapping object
FILE_MAP_WRITE, // desired access
0,
0,
0); // map all file
if (!pShare)
goto FAILE;
char szEventName[512];
szEventName[0] = '\0';
strcat_s(szEventName, 512, "Global\\");
strcat_s(szEventName, 512, pShareName);
strcat_s(szEventName, 512, "_Event");
hEvent = OpenEventA(EVENT_ALL_ACCESS, false, szEventName);
if (!hEvent)
{
hEvent = CreateEventA(NULL, false, false, szEventName);
if (!hEvent)
goto FAILE;
}
pShare->dwReadPos = pShare->dwWritePos = pShare->dwEndTag = 0;
return true;
FAILE:
StopShare();
return false;
}
DWORD GetWriteLen(DWORD dwLength)
{
DWORD dwMax;
if (pShare->dwReadPos == 0)
dwMax = BufferSize - 1;
else if (pShare->dwReadPos > pShare->dwWritePos)
dwMax = pShare->dwReadPos - 1;
else
dwMax = BufferSize;
DWORD dwRet = dwMax - pShare->dwWritePos;
if (dwRet > dwLength)
return dwLength;
return dwRet;
}
// return the left length;
DWORD __declspec(dllexport) WriteBlock(BYTE * pData, DWORD dwLength)
{
DWORD dwWriteMax = 0;
while (dwLength != 0)
{
dwWriteMax = GetWriteLen(dwLength);
if (dwWriteMax == 0)
break;
memcpy(pShare->bData + pShare->dwWritePos, pData, dwWriteMax);
dwLength -= dwWriteMax;
pData += dwWriteMax;
pShare->dwWritePos += dwWriteMax;
if (pShare->dwWritePos >= BufferSize)
pShare->dwWritePos = 0;
::SetEvent(hEvent);
}
return dwLength;
}
DWORD GetReadLen()
{
if (pShare->dwReadPos < pShare->dwWritePos)
return pShare->dwWritePos - pShare->dwReadPos;
else if (pShare->dwReadPos > pShare->dwWritePos)
return BufferSize - pShare->dwReadPos;
else
return 0;
}
bool __declspec(dllexport) WaitForRead()
{
bool bRet;
bRet = ::WaitForSingleObject(hEvent, INFINITE) == WAIT_OBJECT_0;
if (bRet)
{
if (pShare->dwEndTag)
return false;
}
return bRet;
}
bool __declspec(dllexport) ReadBlock(BYTE ** ppData, DWORD * pdwLength)
{
*pdwLength = GetReadLen();
if (*pdwLength == 0)
return false;
*ppData = pShare->bData + pShare->dwReadPos;
return true;
}
void __declspec(dllexport) Readed(DWORD dwLength)
{
DWORD dwLen = GetReadLen();
if (dwLength <= dwLen)
pShare->dwReadPos += dwLength;
else
pShare->dwReadPos += dwLen;
if (pShare->dwReadPos >= BufferSize)
pShare->dwReadPos = 0;
}
2015年09月18日 08点09分
1
//
#include "stdafx.h"
#define BufferSize 1024 * 1024
#define FileSize (BufferSize + sizeof(DWORD) * 3)
typedef struct
{
DWORD dwWritePos;
DWORD dwReadPos;
DWORD dwEndTag;
BYTE bData[BufferSize];
}ShareMemory;
HANDLE hShare = NULL;
HANDLE hEvent = NULL;
ShareMemory * pShare = NULL;
void __dec
lsp
ec(dllexport) StopShare()
{
if (pShare && hEvent)
{
pShare->dwEndTag = 1;
::SetEvent(hEvent);
::Sleep(10);
::WaitForSingleObject(hEvent, 512);
}
if (hEvent)
{
CloseHandle(hEvent);
hEvent = NULL;
}
if (pShare)
{
UnmapViewOfFile(pShare);
pShare = NULL;
}
if (hShare)
{
CloseHandle(hShare);
hShare = NULL;
}
}
bool __declspec(dllexport) StartShare(LPCSTR pShareName)
{
hShare = OpenFileMappingA(FILE_MAP_ALL_ACCESS, false, pShareName);
if (!hShare)
{
hShare = CreateFileMappingA(
INVALID_HANDLE_VALUE, // system paging file
NULL, // security attributes
PAGE_READWRITE, // protection
0, // high-order DWORD of size
FileSize, // low-order DWORD of size
pShareName); // name
if (!hShare)
goto FAILE;
}
pShare = (ShareMemory *)MapViewOfFile(
hShare, // handle to file-mapping object
FILE_MAP_WRITE, // desired access
0,
0,
0); // map all file
if (!pShare)
goto FAILE;
char szEventName[512];
szEventName[0] = '\0';
strcat_s(szEventName, 512, "Global\\");
strcat_s(szEventName, 512, pShareName);
strcat_s(szEventName, 512, "_Event");
hEvent = OpenEventA(EVENT_ALL_ACCESS, false, szEventName);
if (!hEvent)
{
hEvent = CreateEventA(NULL, false, false, szEventName);
if (!hEvent)
goto FAILE;
}
pShare->dwReadPos = pShare->dwWritePos = pShare->dwEndTag = 0;
return true;
FAILE:
StopShare();
return false;
}
DWORD GetWriteLen(DWORD dwLength)
{
DWORD dwMax;
if (pShare->dwReadPos == 0)
dwMax = BufferSize - 1;
else if (pShare->dwReadPos > pShare->dwWritePos)
dwMax = pShare->dwReadPos - 1;
else
dwMax = BufferSize;
DWORD dwRet = dwMax - pShare->dwWritePos;
if (dwRet > dwLength)
return dwLength;
return dwRet;
}
// return the left length;
DWORD __declspec(dllexport) WriteBlock(BYTE * pData, DWORD dwLength)
{
DWORD dwWriteMax = 0;
while (dwLength != 0)
{
dwWriteMax = GetWriteLen(dwLength);
if (dwWriteMax == 0)
break;
memcpy(pShare->bData + pShare->dwWritePos, pData, dwWriteMax);
dwLength -= dwWriteMax;
pData += dwWriteMax;
pShare->dwWritePos += dwWriteMax;
if (pShare->dwWritePos >= BufferSize)
pShare->dwWritePos = 0;
::SetEvent(hEvent);
}
return dwLength;
}
DWORD GetReadLen()
{
if (pShare->dwReadPos < pShare->dwWritePos)
return pShare->dwWritePos - pShare->dwReadPos;
else if (pShare->dwReadPos > pShare->dwWritePos)
return BufferSize - pShare->dwReadPos;
else
return 0;
}
bool __declspec(dllexport) WaitForRead()
{
bool bRet;
bRet = ::WaitForSingleObject(hEvent, INFINITE) == WAIT_OBJECT_0;
if (bRet)
{
if (pShare->dwEndTag)
return false;
}
return bRet;
}
bool __declspec(dllexport) ReadBlock(BYTE ** ppData, DWORD * pdwLength)
{
*pdwLength = GetReadLen();
if (*pdwLength == 0)
return false;
*ppData = pShare->bData + pShare->dwReadPos;
return true;
}
void __declspec(dllexport) Readed(DWORD dwLength)
{
DWORD dwLen = GetReadLen();
if (dwLength <= dwLen)
pShare->dwReadPos += dwLength;
else
pShare->dwReadPos += dwLen;
if (pShare->dwReadPos >= BufferSize)
pShare->dwReadPos = 0;
}