Thema: Delphi Multithreading DLL

Einzelnen Beitrag anzeigen

Olli
(Gast)

n/a Beiträge
 
#3

Re: Multithreading DLL

  Alt 30. Okt 2006, 00:03
Da war dann noch ein Problem.

Aya hat die MM-Funktionen Delphi-Referenz durchsuchenGetMem() und Delphi-Referenz durchsuchenFreeMem() benutzt um Speicher anzufordern und freizugeben. Allerdings hat er einmal in der DLL angefordert und versucht in der EXE freizugeben. Das sollte man nicht machen.

Man muß sich das so vorstellen, daß es zwei "Instanzen" des MM gibt. Einmal in der DLL und einmal in der EXE. Beide arbeiten unabhängig voneinander und verwalten ihre Speicherblöcke. Während ein Delphi-Referenz durchsuchenCopyMemory() noch problemlos geht, ist das bei Delphi-Referenz durchsuchenFreeMem() und Delphi-Referenz durchsuchenGetMem() nicht mehr gegeben - zwei verschiedene MM-Instanzen bedeuten hier, daß der MM welcher einen Block anfordert diesen auch freigeben muß. Man muß sich den MM wie einen Buchhalter vorstellen. In unserem Fall zwei Buchhalter. Beide führen Buch über die ausgegebenen Speicherblöcke und über die, welche zurückgegeben wurden. Aber sie können nicht miteinander kommunizieren - daher wissen sie nicht von den Speicherblöcken des jeweils anderen oder können gar in dessen "Buchhaltung" eingreifen.

Die beste Methode ist, wenn die DLL ihre eigenen Funktionen mitbringt um Speicher zu allozieren und freizugeben. Dadurch wird die Aufgabe an den "DLL-Buchhalter" delegiert, wenn es denn notwendig ist. Und schwuppdi gibt es keine ungültigen Zeigeroperationen mehr

Alternativ kann man die Heap-Manager-Funktionen ala MSDN-Library durchsuchenLocalAlloc(), MSDN-Library durchsuchenGlobalAlloc(), MSDN-Library durchsuchenHeapAlloc() usw. mit ihren jeweiligen Counterparts benutzen. Der Heap-Manager ist prozess-spezifisch und somit nicht abhängig vom aktuellen Modul.

Kann mir vorstellen andere haben auch diesen Denkfehler, denn Aya ist ja nicht gerade Anfänger - daher mein Kommentar! ...

Nachtrag:
Im Falle von MSDN-Library durchsuchenHeapAlloc() und MSDN-Library durchsuchenHeapFree() gilt die Aussage natürlich nur bei Verwendung von MSDN-Library durchsuchenGetProcessHeap(). Ansonsten könnte man natürlich schon modulspezifische Heaps angeben.
  Mit Zitat antworten Zitat