【问题标题】:Problems with accessing Shared Memory using Large_Int使用 Large_Int 访问共享内存的问题
【发布时间】:2012-04-18 14:47:32
【问题描述】:

我正在编写两个应用程序,一个生产者和一个消费者。到目前为止,我的代码与 MSDN 示例几乎相同:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551%28v=vs.85%29.aspx

我在生产者中设置了一个事件,它正确地触发了消费者的响应。生产者在共享内存中创建一个值,消费者正确响应,然后打开该值并通过MessageBox打印出来。

但是我试图让生产者存储一个 LARGE_INT 而不是一个 tchar 数组。当我尝试将 CopyMemory 更改为使用 long 时,出现错误。

CopyMemory((PVOID)pBuf, timeStart, sizeof(long));

关于如何修改它(我的代码与 MSDN 示例几乎相同)以存储和检索 LARGE_INT 的任何想法?

【问题讨论】:

    标签: c windows winapi shared-memory


    【解决方案1】:

    您正在传递timeStart 的值,但您需要传递它的地址:

    CopyMemory((PVOID)pBuf, (void *)&timeStart, sizeof(timeStart));
    

    编辑:但是,我应该补充一点,我认为这通常是错误的方法。使用 CopyMemory,您基本上可以将所有内容都转换为原始数据,然后您必须在数据从另一端出来时将其重组为真实数据。

    我通常更喜欢这样做:

    void *shared_base = whatever; // base address of shared memory segment
    
    struct shared_data { 
        // The types of the data you actually need to share go here...
        LARGE_INTEGER x;
        int y;
        char z[512];
    };
    
    shared_data *data = (shared_data *)shared_base;
    

    双方基本相同。然后,在生产者方面,您会执行以下操作:

    data->x = my_large_integer;
    SetEvent(data_ready);
    

    ...在消费者方面,类似:

    LARGE_INTEGER foo = data->x;
    ResetEvent(data_ready);
    

    这基本上可以让您在一个地方进行转换,然后直接使用结构的成员,而不是在需要访问共享数据的任何地方进行转换。当然,您也可以更详细地使用它——例如,如果您希望能够将(大部分)共享块用于多个目的,您可以使用 union 而不是 @ 987654327@(或者您可能有一个包含union 等的struct,就像任何其他代码一样)。

    【讨论】:

    • 快速问题 - 我如何将 LPCTSTR (pBuf) 转换为 LARGE_INTEGER (time)?
    • @Tsar:因为你得到的只是LARGE_INTEGER的地址,你可以把它转换回原来的类型。
    • 我确实尝试过,但我收到错误“没有合适的构造函数可以从“LPCTSTR”转换为“LARGE_INTEGER””...... 代码:startTime = (LARGE_INTEGER)pBuf ;
    • @Tsar:抱歉,演员表必须是这样的:LARGE_INTEGER x = *(LARGE_INTEGER *)address;`。
    • @Tsar:我还对可能值得一读的答案进行了一些编辑。
    猜你喜欢
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多