C++共享内存传输数据问题求大神指教

hawjb528 2014-03-11 12:27:28
愚生在利用C++共享内存传数据的时候遇到这样的问题~部分代码如下

#define MAP_PREFIX L"Local\\"
#define MAP_NAME L"CallBackMap"
#define FULL_MAP_NAME MAP_PREFIX MAP_NAME

#define MAP_SIZE 65536

#define VIEW_OFFSET 0

#define VIEW_SIZE 0
void CALLBACK DecCBFun(long nPort, char * pBuf, long nSize, HK::FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2)
{
printf("call g_DecCBFun suceess.\n");
printf("nPort=%d,nSize=%d,pFrameInfo.nWidth=%ld,pFrameInfo.nHeight=%ld,pFrameInfo.nStamp=%ld,pFrameInfo.nType=%ld,pFrameInfo.nFrameRate=%ld.\n",
nPort,nSize,pFrameInfo->nWidth,pFrameInfo->nHeight,
pFrameInfo->nStamp,pFrameInfo->nType,pFrameInfo->nFrameRate);

HANDLE hMapFile = NULL;
PVOID pView = NULL;
hMapFile = CreateFileMappingW(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
MAP_SIZE,
FULL_MAP_NAME
);
if (hMapFile == NULL)
{
AfxMessageBox(_T("CreateFileMapping failed \n", ));
goto Cleanup;
}
AfxMessageBox(_T("The file mapping is created\n"));

pView = MapViewOfFile(
hMapFile,
FILE_MAP_ALL_ACCESS,
0,
VIEW_OFFSET,
VIEW_SIZE

);
if (pView == NULL)
{
AfxMessageBox(_T("MapViewOfFile failed\n"));
goto Cleanup;
}
AfxMessageBox(_T("The file view is mapped\n"));
char* pszMessage = pBuf;

memcpy_s(pView, VIEW_SIZE, pszMessage,nSize);
AfxMessageBox(_T("This pBuf is written to the view\n"));

SYSTEMTIME s_t;
STARTUPINFOA s_i;
PROCESS_INFORMATION p_i;
ZeroMemory(&s_i,sizeof(s_i));
s_i.cb = sizeof(s_i);
ZeroMemory(&p_i,sizeof(p_i));

if(!CreateProcessA(NULL,"D:\\MyBackup\\我的文档\\Visual Studio 2010\\Projects\\SHOW\\Debug\\SHOW.exe",
NULL,NULL,FALSE,NULL,NULL,NULL,&s_i,&p_i)){
AfxMessageBox(_T(" Err"));

}
DWORD pid;
pid=p_i.dwProcessId;

我想把pBuf的数据(视频实时回调数据)写进共享内存,然后子进程读取pBuf的数据,利用pBuf的数据进行分析~
父进程运行时报这样的错
debug assertion failed!
Expression:sizeInBytes >=count

File:f\dd\vctools\crt_bld\self_x86\crt\src\memcpy_s.c
Line:62
~
请问是哪里出了问题呢,内存分配大小吗~该怎么解决呢~
另外子进程是不是就可以直接用pBuf的数据?
...全文
281 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawjb528 2014-03-11
  • 打赏
  • 举报
回复
引用 13 楼 Automation_dmu 的回复:
可能是nSize大于你分配的共享区的最大MAP_SIZE了
哈哈~果然是MAP_SIZE设置小了~真心3Q~但是这种方法传送的不是实时数据对吧~就是当第二个参数不断改变的话,内存里的数据是不变的?因为我将传到子进程中的数据(视频回调数据)显示出来的时候,就卡在第一帧上不动了~之后的数据不会更新吗,还是应该在子进程读取的时候不断的去读?
赵4老师 2014-03-11
  • 打赏
  • 举报
回复
引用 14 楼 hawjb528 的回复:
[quote=引用 12 楼 zhao4zhong1 的回复:] 参考8楼!
关键是,用那个堆栈,定位到了> msvcr100d.dll!_VEC_memcpy(void * dst, void * src, int len) + 0x33 字节 C ~然后打开反汇编……看不懂啊[/quote] 双击下一行将光标定位到此次调用的源代码处。
hawjb528 2014-03-11
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
参考8楼!
关键是,用那个堆栈,定位到了> msvcr100d.dll!_VEC_memcpy(void * dst, void * src, int len) + 0x33 字节 C ~然后打开反汇编……看不懂啊
AndyStevens 2014-03-11
  • 打赏
  • 举报
回复
可能是nSize大于你分配的共享区的最大MAP_SIZE了
赵4老师 2014-03-11
  • 打赏
  • 举报
回复
参考8楼!
hawjb528 2014-03-11
  • 打赏
  • 举报
回复
引用 7 楼 Automation_dmu 的回复:
[quote=引用 3 楼 hawjb528 的回复:] [quote=引用 2 楼 Automation_dmu 的回复:] memcpy_s(pView, VIEW_SIZE, pszMessage,nSize); 将这句改成: memcpy_s(pView, MAP_SIZE, pszMessage,nSize);
额~改了之后还会有这样的错误的[/quote]检查你程序中的所有memcpy_s调用, 第二个参数的值不能比第4个参数小[/quote]我把第二个参数改成了nSize或者nSzie*2(nSize为第四个参数),然后又有了新的报错,说内存不能为read,MFCApplication1.exe 中的 0x1024be33 (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 写入位置 0x01547000 时发生访问冲突~这个错误的原因是不是因为内存溢出,还是第二个参数的值太大了啊
赵4老师 2014-03-11
  • 打赏
  • 举报
回复
参考 Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp Microsoft SDK\samples\winbase\SharedMem\Makefile Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp Microsoft SDK\samples\winbase\SharedMem\Queue.h Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt Microsoft SDK\samples\winbase\SharedMem\Common.h
hawjb528 2014-03-11
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
必要时加锁。
加锁的目的是不是可以让文件一边读一边写呢~如果我有多个子进程都要用到共享内存pBuf的数据,是不是我只要将每个子进程都写个OpenFileMapping跟 MapViewOfFile就可以用了呢
赵4老师 2014-03-11
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
AndyStevens 2014-03-11
  • 打赏
  • 举报
回复
引用 3 楼 hawjb528 的回复:
[quote=引用 2 楼 Automation_dmu 的回复:] memcpy_s(pView, VIEW_SIZE, pszMessage,nSize); 将这句改成: memcpy_s(pView, MAP_SIZE, pszMessage,nSize);
额~改了之后还会有这样的错误的[/quote]检查你程序中的所有memcpy_s调用, 第二个参数的值不能比第4个参数小
赵4老师 2014-03-11
  • 打赏
  • 举报
回复
必要时加锁。
hawjb528 2014-03-11
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx
请问CopyMemory()这里面需要传输的数据可以是实时数据吗~就跟我那里面的pBuf一样
hawjb528 2014-03-11
  • 打赏
  • 举报
回复
引用 2 楼 Automation_dmu 的回复:
memcpy_s(pView, VIEW_SIZE, pszMessage,nSize); 将这句改成: memcpy_s(pView, MAP_SIZE, pszMessage,nSize);
额~改了之后还会有这样的错误的
AndyStevens 2014-03-11
  • 打赏
  • 举报
回复
memcpy_s(pView, VIEW_SIZE, pszMessage,nSize); 将这句改成: memcpy_s(pView, MAP_SIZE, pszMessage,nSize);
AndyStevens 2014-03-11
  • 打赏
  • 举报
回复
memcpy_s.c的第62行断言sizeInBytes >=count出错了。

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧