Announcement

Collapse
No announcement yet.

DDL's und Shared Memory

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DDL's und Shared Memory

    Hallo,
    ich möchte in einer DLL ein Datensegment anlegen, welches von allen Instanzen, die die DLL aufrufen, gemeinsam benutzt wird.<BR>Hat eventuell jemand ein Beispiel, wie dieses realisiert werden kann?<BR>Grüße Klaus Schimpf

  • #2
    Hier unsere Klasse fuer Shared-Memory (Formatierung ist auf die Schnelle nicht so schön):

    mfg Udo Galle

    SharedMem.h

    <PRE>
    #ifndef SharedMemH
    #define SharedMemH

    class TSharedMem
    {
    private:
    HANDLE hMem;
    String Name;

    public:
    TSharedMem( const String& rName,
    DWORD nSize,
    bool bCreate,
    DWORD nProtect = PAGE_READWRITE | SEC_COMMIT );

    const String& GetName() { return Name; }
    HANDLE GetHandle() { return hMem; }
    };
    //---------------------------------------------------------------------------
    class TSharedMemLock
    {
    private:
    TSharedMem& Mem;
    void* Data;

    public:
    TSharedMemLock( TSharedMem& rMem );
    ~TSharedMemLock();

    void* GetData() { return Data; };
    };
    //---------------------------------------------------------------------------
    #endif

    SharedMem.cpp

    /*---------------------------------------------------------------------------

    Modul SharedMem

    Copyright (c) Informationstechnik Grieb GmbH 2001
    Alle Rechte vorbehalten

    Beschreibung
    Klasse für Ansprechen von shared memory

    Aenderungen:
    * $Log: SharedMem.cpp,v $
    * Revision 1.1 2001/05/30 14:05:08 uga
    * initial revision
    *
    ---------------------------------------------------------------------------*/

    #include <Project.hpp>
    #pragma hdrstop

    #include "SharedMem.h"

    //---------------------------------------------------------------------------
    #pragma package(smart_init)

    //---------------------------------------------------------------------------
    // TSharedMem
    //---------------------------------------------------------------------------
    TSharedMem::TSharedMem( const String& rName,
    DWORD nSize,
    bool bCreate,
    DWORD nProtect )
    : Name( rName )
    {
    // Wird bCreate == true angegeben, wenn der entsprechende Speicherbereich schon existiert,
    // dann wird dieser geöffnet. Die OpenFileMapping-Funktion muß hier nicht benutzt werden

    FUNCBEGIN( "TSharedMem::TSharedMem" );

    if ( bCreate )
    {
    hMem = CreateFileMapping( reinterpret_cast<HANDLE>(0xFFFFFFFF), NULL,
    nProtect, // Default=PAGE_READWRITE | SEC_COMMIT,
    0, nSize,
    rName.c_str() );
    LTRACE2( "create shared memory; Name=" << rName << ",Size=" << nSize );
    }
    else
    {
    hMem = OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE, rName.c_str() );
    LTRACE2( "open shared memory; Name=" << rName );
    }

    if ( hMem == NULL )
    {
    LTRACE( "shared memory Name=" << rName << " konnte nicht initialisiert werden" );
    RaiseLastWin32Error();
    }
    };

    //---------------------------------------------------------------------------
    // TSharedMemLock
    //---------------------------------------------------------------------------
    TSharedMemLock::TSharedMemLock( TSharedMem& rMem )
    : Mem( rMem )
    {
    FUNCBEGIN( "TSharedMemLock::TSharedMemLock" );
    Data = MapViewOfFile( rMem.GetHandle(), FILE_MAP_ALL_ACCESS, 0, 0, 0 );
    if ( Data == NULL )
    {
    LTRACE( "auf shared memory Name=" << rMem.GetName() << " konnte nicht zugegriffen werden" );
    RaiseLastWin32Error();
    }
    }
    //---------------------------------------------------------------------------
    TSharedMemLock::~TSharedMemLock()
    {
    Win32Check( UnmapViewOfFile( Data ) );
    }
    //---------------------------------------------------------------------------
    <BR><BR><BR>
    Benutzung Beispiel:
    pMem via new anlegen
    via TSharedMemLock Pointer auf Speicher zum kopieren holen

    memcpy( &aTel.Data, TSharedMemLock( *pMem ).GetData(), sizeof(aTel.Data) )

    Comment


    • #3
      Ich habe ein Programm, welche eine solche DLL hat.

      Wenn du den Quelltext der DLL willst??

      http://home.snafu.de/christian.marquardt/programme.4/4_urlchecker.html

      Eine Erklärung zu Shared Memory ist auch in der WIN 32 API HLP-Date
      Christian

      Comment


      • #4
        Lieber Udo,<B>danke für das Code-Beispiel. Würde aber gerne die Daten nicht<B>auf einer Datei auslagern.<B>
        Lieber Christian,<B>gerne würde ich auf Dein Angebot zurückkommen,<B> in der Quelle der DLL den Syntax für Shared Memory nachzuvollziehen.<B> Müssen die "shared" Daten in der *.exe, welche<B> die DLL verwendet, entsprechend gekennzeichnet werden oder nicht?<B><B> Viele Grüße Klaus Schimp

        Comment


        • #5
          Lieber Udo,<BR>danke für das Code-Beispiel. Würde aber gerne die Daten nicht auf einer Datei auslagern.<BR><B>
          Lieber Christian,<BR>gerne würde ich auf Dein Angebot zurückkommen,<BR> in der Quelle der DLL den Syntax für Shared Memory nachzuvollziehen.<BR> Müssen die "shared" Daten in der *.exe, welche<BR> die DLL verwendet, entsprechend gekennzeichnet werden oder nicht?<BR><BR> Viele Grüße Klaus Schimpf<BR>
          [email protected]

          Comment

          Working...
          X