注册 登录
编程论坛 C语言论坛

不同位数程序共享内存的创建及访问

纯蓝之刃 发布于 2023-09-05 14:07, 343 次点击
我需要运行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;
}
0 回复
1