0

プロデューサーとコンシューマーの 2 つのアプリケーションを作成しています。私のコードは、これまでの MSDN の例とほぼ同じです。

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

コンシューマーで応答を正しくトリガーするイベントをプロデューサーに設定しました。プロデューサは共有メモリに値を作成し、コンシューマは正しく応答し、値を開いて MessageBox 経由で出力します。

ただし、プロデューサーに tchar 配列ではなく LARGE_INT を格納させようとしています。代わりに long を使用するように CopyMemory を変更しようとすると、エラーが発生します。

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

LARGE_INT を格納および取得するためにそれを変更する方法についてのアイデアはありますか (私のコードは MSDN の例とほぼ同じです)。

4

1 に答える 1

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

これにより、基本的に、共有データにアクセスするために必要なすべての場所でキャストを行う代わりに、1 つの場所でキャストを行ってから、構造体のメンバーを直接使用できます。もちろん、それをもっと精巧にすることもできます。たとえば、共有ブロック (のほとんど) を複数の目的で使用できるようにしたい場合は、a のunion代わりに a struct(または他のコードと同様に、astructを含む aなどがあります)。union

于 2012-04-18T14:51:33.593 に答える