| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 348 人关注过本帖
标题:不同位数程序共享内存的创建及访问
取消只看楼主 加入收藏
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:570
专家分:3727
注 册:2019-7-29
结帖率:93.75%
收藏
 问题点数:0 回复次数:0 
不同位数程序共享内存的创建及访问
我需要运行32位程序创建共享内存,64位程序进行访问,进行数据的交互。请问美村的初始化和访问与在同一位数程序中有什么不同,该怎么实现。
以下我的实现:
32位程序创建共享内存
bool DMConnection::CreateSharedMemory()
{
    int memory_len = 65536;
#ifdef Q_OS_WIN
    // 创建共享文件句柄
    hMapFile = CreateFileMapping(
                   INVALID_HANDLE_VALUE,   // 物理文件句柄
                   NULL,   // 默认安全级别
                   PAGE_READWRITE,   // 可读可写
                   0,   // 高位文件大小
                   memory_len,   // 低位文件大小
                   L"DMShareMemory"   // 共享内存名称
               );

    // 映射缓存区视图 , 得到指向文件映射视图的指针
    pSHM = (struct MemoryCmd *)MapViewOfFile(
               hMapFile,            // 共享内存的句柄
               FILE_MAP_ALL_ACCESS, // 可读写许可
               0,
               0,
               memory_len
           );
    memset(pSHM, 0, memory_len);

#else
    int SID;
    if((SID = shmget(keySHM, memory_len, 0666 | IPC_CREAT | IPC_SHARE32)) == -1)
    {
        if((SID = shmget(keySHM, 0, 0666 | IPC_CREAT | IPC_SHARE32)) == -1)
        {
            fprintf(stderr, "shmget fail!\n");
            return false;
        }
        if(shmctl(SID, IPC_RMID, NULL) == -1)
        {
            fprintf(stderr, "shmget fail!\n");
            return false;
        }
        if((SID = shmget(keySHM, memory_len, 0666 | IPC_CREAT | IPC_SHARE32)) == -1)
        {
            fprintf(stderr, "shmget fail!\n");
            return false;
        }
    }

    if((pSHM = (struct MemoryCmd *)shmat(SID, 0, 0)) == (char *) - 1)
    {
        fprintf(stderr, "shmat fail!\n");
        pSHM = NULL;
        return false;
    }
    memset(pSHM, 0, memory_len);
#endif

    return true;
}

64位程序访问共享内存
bool InitMemory()
{
    int memory_len = 65536;
#ifdef Q_OS_WIN
    // 打开共享的文件对象
    hMapFile = OpenFileMappingA(FILE_MAP_ALL_ACCESS, NULL, L"DMShareMemory");

    if(hMapFile)
    {
        pSHM = (struct MemoryCmd *)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    }
    else
    {
        // 打开文件映射句柄失败
        printf("打开文件映射句柄失败");
        return false;
    }
#else
    pSHM = NULL;
    keySHM = 0xfff01;

    int shmid;
    if((shmid = shmget(keySHM, memory_len, IPC_SHARE32)) == -1)   //0600
    {
        printf("shmget Fail \n");
        return false;
    }
    pSHM = (struct MemoryCmd *)shmat(shmid, NULL, 0);
#endif

    pSHM->connect = 1;
    return true;
}
搜索更多相关主题的帖子: 内存 共享 文件 访问 return 
2023-09-05 14:07
快速回复:不同位数程序共享内存的创建及访问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017743 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved