还是关于CreateFileMapping的4参数和5参数的有关问题。

还是关于CreateFileMapping的4参数和5参数的问题。。

上一次提问见 http://topic.****.net/u/20090826/09/9d631b06-025e-4efe-9d15-c15dce8d36b1.html

谢谢各位帮看看

我使用内存映射文件 创建了一个大小为 10*1024的内存映射

代码:

C/C++ code
    m_hShareMem = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE|SEC_COMMIT,0,10*1024,cstrShareMemName);
    if (NULL == m_hShareMem)
    {
        if (ERROR_ALREADY_EXISTS == GetLastError())
        {
            return 1;
        }
        else
        {
            return -1;
        }

    }


这段共享内存 由9个进程共享 每个进程在共享内存中有自己的数据区 1024 字节

分段如下

0__1__2(主程序) 间距1024字节
2__3 进程1
3__4 进程2
4__5 进程3
5__6 进程4
6__7 进程5
7__8 进程6
8__9 进程7
9__10 进程8

各进程通过下面的dwSort来判断自己从哪里开始

C/C++ code
    switch (dwSort)
    {
    case 0:
        dwOffset = 1024*2;
        break;
    case 1:
        dwOffset = 1024*3;
        break;
    case 2:
        dwOffset = 1024*4;
        break;
    case 3:
        dwOffset = 1024*5;
        break;
    case 4:
        dwOffset = 1024*6;
        break;
    case 5:
        dwOffset = 1024*7;
        break;
    case 6:
        dwOffset = 1024*8;
        break;
    case 7:
        dwOffset = 1024*9;
        break;
    default:
        break;
    }


各个进程通过映射共享内存,然后头地址加上这些通过序号得到的偏移获得自己在共享内存中的数据区开始地址 


C/C++ code
    LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
    if (NULL == lpMapAddr)
    {
        CloseHandle(hMapping);
        hMapping = NULL;
        return ;
    }

LPTSTR pMove = lpMapAddr;
pMove += dwOffset;


我感觉逻辑上是没有问题的,但是dwSort = 4 的时候 就崩掉了 错误定位在偏移之后对数据区的访问上

debug下面的提示是 内存访问冲突,,估计是访问了不在共享内存中的地址

百思不得其解。。。望各位大大指教。。





------解决方案--------------------
呵呵。

4*1024 看到这个你想到了什么呢?32位的系统?
------解决方案--------------------
把LPTSTR强制转化为(char*)再做指针运算,可能LPTSTR占两位,而部是一位