【问题标题】:C++ WIN32 Creating An Array of Integers and Booleans in Shared MemoryC++ WIN32 在共享内存中创建整数和布尔数组
【发布时间】:2013-09-30 17:54:33
【问题描述】:

我正在尝试在共享内存中创建一个 int 数组和一个 bool 数组。到目前为止,我有以下代码运行没有错误并且“显然”创建了内存,但是我不确定我是否可以使用 LPCTSTR 像数组一样访问数据?有人可以解释一下解决这个问题的最佳方法,因为我发现 MSDN 非常缺乏和痛苦。

void createSharedMemory()
{
    const char slotsName[]="Slots";
    const char flagsName[]="Flags";

    const LONG BufferSize = sizeof(int);
    const LONG Buffers = 10;
    const LONG FlagSize = sizeof(bool); 

    HANDLE hSlots = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, BufferSize * Buffers, SLOTSNAME);
    assert(hSlots != NULL);

    HANDLE hFlags = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, FlagSize * Buffers, flagsName);
    assert(hSlots != NULL);

    std::cout << "Created shared memory!" << std::endl;
}


int main(int argc, char* argv[])
{
    createSharedMemory();

    HANDLE hSlots;
    LPCTSTR pSlots;

    hSlots = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, SLOTSNAME);

    if(hSlots == NULL)
    {
        std::cout << "Could not open slots file mapping object:" << GetLastError() << std::endl;
        getchar();
        return 0;
    }

    pSlots = (LPTSTR) MapViewOfFile(hSlots, FILE_MAP_ALL_ACCESS, 0, 0, 10 * sizeof(int));

    if(pSlots == NULL)
    {
        std::cout << "Could not map view of slots file:" << GetLastError() << std::endl;
        CloseHandle(hSlots);
        getchar();
        return 0;
    }

    std::cout << "Mapped slots correctly!" << std::endl;

    HANDLE hFlags;
    LPCTSTR pFlags;

    hFlags = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, FLAGSNAME);

    if(hFlags == NULL)
    {
        std::cout << "Could not open flags file mapping object:" << GetLastError() << std::endl;
        getchar();
        return 0;
    }

    pFlags = (LPTSTR) MapViewOfFile(hFlags, FILE_MAP_ALL_ACCESS, 0, 0, 10 * sizeof(bool));

    if(pFlags == NULL)
    {
        std::cout << "Could not map view of flags file:" << GetLastError() << std::endl;
        CloseHandle(hFlags);
        getchar();
        return 0;
    }

    std::cout << "Mapped flags correctly!" << std::endl;

    //Access the data here

    getchar();

    UnmapViewOfFile(pSlots);
    CloseHandle(hSlots);

    UnmapViewOfFile(pFlags);
    CloseHandle(hFlags);

    return 0;
}

【问题讨论】:

  • 为什么要创建相对于多个intbool的文件映射,然后将返回的指针转换为LPTSTR
  • 你为什么使用显式转换而不是INVALID_HANDLE_VALUE
  • 我的错误,我试图转换并跟随一篇 MSDN 文章。

标签: c++ arrays winapi shared-memory


【解决方案1】:

MapViewOfFile() 将共享内存映射到进程的地址空间。从那时起(直到它未映射),您可以将其视为您分配(或在堆栈上声明)的本地内存块。

共享内存句柄hSlots 的大小为10 * sizeof(int) 字节,如果您真的在此内存中存储整数,那么最简单的做法是将pSlots 声明为int*

int* pSlots = reinterpret_cast<int*>( MapViewOfFile(hSlots, FILE_MAP_ALL_ACCESS, 0, 0, 10 * sizeof(int)) );
if (pSlots)
{
    // pSlots can now be used as an array
    for (int i = 0; i < 10; i++)
    {
        pSlots[i] = i; // etc etc 
    }
}

【讨论】:

  • 完美,正是我需要的。谢谢:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多