使用Large_Int访问共享内存时出现问题

时间:2012-04-18 14:47:33

标签: c windows winapi shared-memory

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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代替struct {或者您可能有struct包含union等,就像其他代码一样。)