C 使用大整数访问共享内存时出现问题

C 使用大整数访问共享内存时出现问题,c,windows,winapi,shared-memory,C,Windows,Winapi,Shared Memory,我正在写两个应用程序,一个生产者和一个消费者。到目前为止,我的代码与MSDN示例几乎相同: 我已经在生产者中设置了一个事件,它正确地触发消费者的响应。生产者在共享内存中创建值,消费者正确响应,然后打开值并通过MessageBox打印 但是,我试图让生产者存储一个大的INT,而不是一个tchar数组。当我尝试将CopyMemory更改为使用long时,会出现错误 CopyMemory((PVOID)pBuf, timeStart, sizeof(long)); 关于如何修改它(我的代码与MSD

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

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

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

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

关于如何修改它(我的代码与MSDN示例几乎相同)以存储和检索大整数,您有什么想法吗?

您正在传递
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);
这在双方基本上是相同的。然后,在制作人方面,你会做一些类似的事情:

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);
…在消费者方面,类似于:

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);

这基本上允许您在一个位置执行强制转换,然后直接使用结构的成员,而不是在访问共享数据所需的任何位置进行强制转换。当然,您也可以使用它进行更详细的操作——例如,如果您希望能够将(大部分)共享块用于多个目的,您可以使用
联合
而不是
结构
(或者您可能有一个
结构
包含
联合
,等等,就像使用任何其他代码一样).

快速问题-如何将LPCTSTR(pBuf)转换为大整数(时间)?@Tsar:由于您得到的只是
大整数的地址,您可以将其转换回原始类型。我尝试过,但我遇到了错误“没有合适的构造函数将“LPCTSTR”转换为“大整数”。。。。。。。。。代码:startTime=(大整数)pBuf@沙皇:对不起,强制转换需要类似于:大整数x=*(大整数*)地址;`@沙皇:我还对答案做了一些编辑,可能值得一读。