我有同一进程的不同线程(所以地址空间是一样的)中CreateFileMapping了二个以上不同的文件,CreateFileMapping调用成功,但读指针移动时出错(二个以上的线程同时在读,但文件是不同的)请问,一个进程是否不能同时打开多个文件映射??
解决方案 »
- Visual 2005\VC\PlatformSDK\include\winnt.h(256) : error C2144: 语法错误 : “char”的前面应
- MFC中的edit控件怎样能被多次赋值并且控件上都显示出所赋的值
- ODBC调用返回参数的存储过程没有反应?
- CButtonST是否可以动态加载图片(如.bmp,.jpg等)?
- 招聘软件销售人员(在校生优先)
- 如何保证一段代码不间断执行完
- 某类只提供.dll和.lib及.h,没有源码,我引用此类时能否做到编译后不依赖此类的dll而独立运行?
- 有关变量的生存期,
- 请问edit框的问题
- 在使用CFile类的Write函数的时候有一个问题(300分)
- 使用动态方式创建的ListCtrl控件如何才能响应OnColumnclick?
- 读取文本文件的问题?
线程代码(包括创建文件映射)如下:DWORD WINAPI PlayFileProc(void *p)
{
CMediaStream *pMedia = (CMediaStream*) p; unsigned char *pData;// = pMedia->m_pFileBuf + AVI_HEAD_SIZE; //pfh = (FrameHead*) pData; DWORD vfn = 0, afn = 0;
MediaHead mh; pMedia->m_hFile = CreateFile(pMedia->m_sFileName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL); if (pMedia->m_hFile == INVALID_HANDLE_VALUE){ return FALSE;
}
DWORD dwFileSize = GetFileSize(pMedia->m_hFile, NULL);
HANDLE hMapFile;
hMapFile = CreateFileMapping(pMedia->m_hFile, // current file handle
NULL, // default security
PAGE_READWRITE, // read/write permission
0, // size of mapping object, high
dwFileSize, // size of mapping object, low
NULL); // name of mapping object
if (hMapFile == NULL) {
return FALSE;
} unsigned char *lpMapAddress;
lpMapAddress = (unsigned char *)MapViewOfFile(hMapFile, // handle to mapping object
FILE_MAP_ALL_ACCESS, // read/write permission
0, // high-order 32 bits of file offset
0, // low-order 32 bits of file offset
dwFileSize); // number of bytes to map if (lpMapAddress == NULL) {
return FALSE;
}
if(strncmp((char*)lpMapAddress, "RIFF", 4))
{
MessageBox(NULL, "Not valid AVI File", "Error", MB_OK);
return FALSE;
}
pData = lpMapAddress + AVI_HEAD_SIZE; pMedia->m_pFileBuf = lpMapAddress; AVIHead *pAVIHead = (AVIHead*)pMedia->m_pFileBuf; pMedia->m_nVideoFrames = pAVIHead->nVideoFrames; DWORD m_dwPlayFileID; while (vfn < pMedia->m_nVideoFrames)
{
pfh = (FrameHead*)pData;
pData += 8;
if ( pfh->sType[0] == '0' && pfh->sType[1] == '0' && pfh->sType[2] == 'd')
{
// 视频部分 }
else if ( pfh->sType[0] == '0' && pfh->sType[1] == '1' && pfh->sType[2] == 'w')
{
//音频部分
}
else
{ // exception 处理
}
if ((pfh->dwLen&3))
MessageBox(NULL, "len error", "AVI Error", MB_OK); pData += pfh->dwLen;
}
return TRUE;
}
这两个相差0x49 0000 < 1M,而我的文件全是大于1M的,那肯定重叠了!