0

DLL間でオブジェクトを共有するにはどうすればよいですか?

例:

DLLAはプロセスAによってロードされます。DLLAはデータを収集します(プロセスAからの呼び出しをインターセプトします)。

DLLBはPascalプログラムによってロードされ、DLLAが収集したデータを使用したいと考えています。

次のように、DLLAを使用してマッピングを作成しました。

GL_EXTERN bool __stdcall CreateSharedMemory()
{
    if ((hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MapSize, SharedMemoryName.c_str())) == NULL)
    {
        return false;
    }

    if ((pData = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, MapSize)) == NULL)
    {
        CloseHandle(hMapFile);
        return false;
    }
    return true;
}

そして、DLLBはそれを開いてマップするだけです。

彼らはコマンドを共有することができます。したがって、DLL BはDLLAコマンドを実行してデータを取得できますが、メモリ全体でオブジェクト/クラス/ベクトルを共有する方法がわからないようです。

ポインタを使用してみましたが、これは無効であり、アクセス違反エラーが発生することに気付きました。また、整数をうまく共有しているように見えますが、floatを共有できないようです:Sこれらのタスクを実行するにはどうすればよいですか?

編集:私が行うことを伝えるために:

int* Foo = static_cast<int*>(pData); where pData is the map pointer.
//Then I do:

Foo[0] = X; Foo[1] = Y;

そして、対応する値からプロセスに読み取りと書き込みをさせます。

情報:

これはDLLAのファイルです:http://pastebin.com/MFkqwxJe およびhttp://pastebin.com/MDeWprkb

これはDLLBのファイルです:http://pastebin.com/Uj3dijc4 およびhttp://pastebin.com/vkDdPp7e

編集:要求に応じてhttp://pastebin.com/hNF6Cu2Lに絞り込みました。

4

1 に答える 1

1

共有メモリ領域では、整数や浮動小数点数などのすべての基本的なデータ型を使用できます。floatに問題がある場合、これは、float / double /long_doubleが何であるかについてのC/Pascal間の異なる理解のように、メモリの共有の性質とは関係ありません。ポインタは使用できません。VMTを生成せず、ポインターを持たない構造も問題ありません。複雑なデータ構造は、共有領域の先頭からのオフセット(直接または間接)を使用してエミュレートできます。

(イベントのように)同期を行うには、名前付きオブジェクトを使用できます。

プロセス間でハンドルを渡すこともできます。機能を確認してくださいDuplicateHandle

継続:

    Data[3] = &ListOfModels[0];

ここでは、共有メモリ領域に属していないアドレスを共有メモリに入れます。共有メモリ領域のデータは完全に自己完結型である必要があります。つまり、すべてのデータがその領域にある必要があります。構造の定義は次のようになります。

struct SaredData
{
    int data_type;
    int status;
    union
    {
        struct
        {
            int       num_font_char_objects;
            FontChar  font_char_objects[MAX_FONT_CHARS_SUPPORTED];
        };
        ...........
    };
};

また、共有メモリ領域のサイズが、渡されたすべてのオブジェクトを格納するのに十分な大きさであることを確認する必要があります。STLのコンテナが共有メモリで動作する可能性はほとんどありません。

Model構造体には複雑なフィールドが含まれているため、上記のユニオンに構造体を配置することはできません。

于 2012-08-10T00:47:26.593 に答える