Dll Prozesse zählen



  • Hallo,

    ich versuche in meiner Dll die Anzahl der Prozesse zu zählen die diese Aufrufen.

    Leider funktioniert es nicht im Debug String steht immer 1 egal wieviele instanzen ich von meinem Programm öffne.

    BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
     static TWord uwCountProcess = 0;
     TByte sDebug[500];
    
     switch (ul_reason_for_call)
     {
     case DLL_PROCESS_ATTACH:
         uwCountProcess++;
         sprintf((char *)sDebug,"Process Attach: %d",uwCountProcess);
         OutputDebugString((LPCTSTR)sDebug);
       break;
     case DLL_THREAD_ATTACH:
       break;
     case DLL_THREAD_DETACH:
       break;
     case DLL_PROCESS_DETACH:
          uwCountProcess--;
          sprintf((char *)sDebug,"Process Detach: %d",uwCountProcess);
          OutputDebugString((LPCTSTR)sDebug);
        break;
    
      default:
        break;
        }
    
      return TRUE;
    }
    

    Hat jemand eine Idee?

    MfG


  • Mod

    DLLs werden immer in den eigenen Prozessraum geladen.
    Wenn Du alle Prozesse zählen willst müsstest Du ein Stück Memory als Shared definieren.



  • Ich dachte immer der Vorteil von Dll´s ist das sie nur einmal geladen werden und mehrere Programme dann die Funktion nutzen.

    Wenn jedes Programm die Dll selber läd, dann geht diese Vorteil doch verloren?

    Wie mache ich das mit dem Shared Memory?

    MfG



  • Die DLL wird auch nur einmal geladen. Der Code steht im Speicher und wird dann vom zugreifenden Process benutzt.

    Dies aber auch nur wenn die DLL immer aus dem gleichen verzeichnis aufgerufen wird.
    Ist die gleiche DLL in Unterschiedlichen Ordners und wird jeden von einem anderen Programm geladen dann ist der gleiche Code 2 Mal im Speicher.

    #pragma data_seg ("shared")
    
    char globstring[256][64] = {'\0'};
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:shared,RWS")
    


  • bei mir wird die Dll aus dem gleichen Verzeichnis heraus benutzt, wieso klappt das dann mit dem Counter nicht?



  • Hat dir doch Martin schon geschrieben.

    "eigenen Prozessraum"

    Dies hat nichts damit zu tun das die DLL nur einmal im Speicher ist.
    Ein Process kan nnicht auf den Speicher eines anderen zugreifen.
    Sharedmemory ist dein freund.


  • Mod

    Destiniy schrieb:

    bei mir wird die Dll aus dem gleichen Verzeichnis heraus benutzt, wieso klappt das dann mit dem Counter nicht?

    Der Code Teil wird geshared. Der Datenteil der DLL existiert in jedem Prozess jeweils extra...



  • mit dem Shared Memory für den Counter das geht.

    Wie lege ich eine Liste in Shared memory an?

    Den Pointer in als Shared zu deklarieren hilft nix. Wie bekomme ich das Programm dazu bei einem new den Speicher aus dem Shared Memeory zu holen.

    MfG


  • Mod

    Destiniy schrieb:

    mit dem Shared Memory für den Counter das geht.
    Wie lege ich eine Liste in Shared memory an?
    Den Pointer in als Shared zu deklarieren hilft nix. Wie bekomme ich das Programm dazu bei einem new den Speicher aus dem Shared Memeory zu holen.

    Mit Liste meinst Du stl::list?
    Das kannst Du knicken. Solche Sachen musst Du brav manuell machen. Am besten nicht über statisch geshartn Speicher, sondern über eine Memory Mapped file.
    Aber bei der COntainter Verwaltung hilft Dir keiner. Es gibt in dem Sinne keinen "globalen gesharten malloc/new".

    PS: Bitte verwende Interlocked... Funktionen! Dein Zähler kann von mehreren Prozessen gleichzeitig veränderten werden.



  • also ich habe ein Template für meiner Listenklasse welches meine Liste verwaltet, dem übergebe ich nur den Datentyp der Liste.
    Einfügen, Löschen usw.

    Also ist schon selbst gebaut.

    Im moment hole ich mir den Speicher für ein Listenelment mit new. Wie kann ich mir den Speicher für ein Listenelment aus dem shared Memory holen?

    MfG

    PS: das Zählen war nur zum testen bei meinen Listenfunktionen werd ich dann eine Critical Section nutzten.


Anmelden zum Antworten