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



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

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

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

但是,我试图让制作者存储LARGE_INT而不是 tchar 数组。当我尝试将 CopyMemory 更改为使用长时,出现错误。

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

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

您传递的值为 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(或者您可能有一个包含union等的struct,就像任何其他代码一样)。

最新更新