Seite 1 von 1

In DLL reservierten Speicher freigeben

Verfasst: 15.03.2010 17:47
von teejex
Hallo

ich habe das Problem, dass, wenn ich in einer DLL Speicher reserviere und einen Pointer darauf zurückgebe,
ich den Speicher wohl auslesen, aber nicht wieder freigeben kann.

Vielleicht könnt ihr mir nen Tipp geben, wie ich den Speicher trotzdem freigeben kann - oder mir sagen, warum das überhaupt so ist^^

MfG
Teejex

Code: Alles auswählen

; Testprogramm
dll$="C:\Users\admmin\Desktop\dlltest.dll"
    
OpenConsole()
  
  If OpenLibrary(0,dll$)
    *ptr = GetFunction(0,"test")
    If *ptr
      PrintN(PeekS(*ptr))
      FreeMemory(*ptr)
    Else
      PrintN("error")
    EndIf
  Else
    PrintN("could not open lib")
  EndIf
Input()
CloseConsole()

Code: Alles auswählen

; Test-DLL
ProcedureDLL test()
  *mem=AllocateMemory(64)
  If *mem
    PokeS(*mem,"Gruseltiger")
    ProcedureReturn *mem
  EndIf
  
  FreeMemory(*mem)
  ProcedureReturn #False
EndProcedure

Re: In DLL reservierten Speicher freigeben

Verfasst: 15.03.2010 17:54
von ts-soft
Warum allokierste überhaupt Speicher, ist in Deinem Beispiel zumindest überflüssig:

Code: Alles auswählen

 ; Test-DLL
ProcedureDLL test()
  Static Text.s
  Text = "Gruseltiger"
  ProcedureReturn @Text
EndProcedure

Debug PeekS(test())
// edit
Das Freigeben von Speicher, dessen allokieren fehlgeschlagen ist, ist natürlich auch falsch!

Re: In DLL reservierten Speicher freigeben

Verfasst: 15.03.2010 18:04
von cxAlex
Du muss eine FreeMemory - Funktion in der DLL erstellen und nach außen wrappen:

Code: Alles auswählen

ProcedureDLL DLL_FreeMemory(*Mem)
  ProcedureReturn FreeMemory(*Mem)
EndProcedure
Das selbe Problem habe ich in ECluster auch, der Speicher der in der DLL reserviert wird gehört zum Heap der DLL und kann deshalb auch nur von ihr freigegeben werden.

Gruß, Alex

Re: In DLL reservierten Speicher freigeben

Verfasst: 15.03.2010 18:32
von DarkDragon
Das ist aber nicht erlaubt:
http://www.purebasic.com/german/faq.php hat geschrieben: Ist es erlaubt, mit PureBasic erstellte DLL's in anderen Projekten zu erstellen ?

Allgemein ja. Sie können DLL's, welche PureBasic-Befehle enthalten, ohne Einschränkungen für Ihre eigenen Projekte erstellen. Es ist jedoch nicht erlaubt, einfache "Wrapper" DLL's (enthalten z.B. alle Befehle einer PureBasic Library) zum Einfügen der PureBasic-Befehle in anderen Programmiersprachen zu veröffentlichen.

Re: In DLL reservierten Speicher freigeben

Verfasst: 15.03.2010 18:34
von Josh
reserviere in deinem hauptprogramm den speicher, übergib der dll einen pointer darauf und lass die dll in diesen speicher reinschreiben.

Re: In DLL reservierten Speicher freigeben

Verfasst: 15.03.2010 18:42
von ts-soft
DarkDragon hat geschrieben:Das ist aber nicht erlaubt:
http://www.purebasic.com/german/faq.php hat geschrieben: Ist es erlaubt, mit PureBasic erstellte DLL's in anderen Projekten zu erstellen ?

Allgemein ja. Sie können DLL's, welche PureBasic-Befehle enthalten, ohne Einschränkungen für Ihre eigenen Projekte erstellen. Es ist jedoch nicht erlaubt, einfache "Wrapper" DLL's (enthalten z.B. alle Befehle einer PureBasic Library) zum Einfügen der PureBasic-Befehle in anderen Programmiersprachen zu veröffentlichen.
Hierbei werden aber nicht alle Befehle einer Library gewrapped, lediglich einer, dessen Nutzung erforderlich
ist, also trifft diese Einschränkung hierbei wohl nicht zu.

Josh seine Alternative ist der übliche Weg.

Re: In DLL reservierten Speicher freigeben

Verfasst: 15.03.2010 18:43
von DarkDragon
ts-soft hat geschrieben:
DarkDragon hat geschrieben:Das ist aber nicht erlaubt:
http://www.purebasic.com/german/faq.php hat geschrieben: Ist es erlaubt, mit PureBasic erstellte DLL's in anderen Projekten zu erstellen ?

Allgemein ja. Sie können DLL's, welche PureBasic-Befehle enthalten, ohne Einschränkungen für Ihre eigenen Projekte erstellen. Es ist jedoch nicht erlaubt, einfache "Wrapper" DLL's (enthalten z.B. alle Befehle einer PureBasic Library) zum Einfügen der PureBasic-Befehle in anderen Programmiersprachen zu veröffentlichen.
Hierbei werden aber nicht alle Befehle einer Library gewrapped, lediglich einer, dessen Nutzung erforderlich
ist, also trifft diese Einschränkung hierbei wohl nicht zu.
Es steht aber "z.B." davor. Naja ich denke das PureBasic Team würde bei einem so schlichten Befehl wohl ein Auge zudrücken.

Re: In DLL reservierten Speicher freigeben

Verfasst: 15.03.2010 18:52
von ts-soft
DarkDragon hat geschrieben: Es steht aber "z.B." davor. Naja ich denke das PureBasic Team würde bei einem so schlichten Befehl wohl ein Auge zudrücken.
Mit Auge zudrücken hat dieses Beispiel weniger zu tun, wenn dies nicht möglich wäre, würde dies die
Möglichkeit der DLL Erstellung ad absurdum führen.

Es geht ja nur um das einfache Wrappen um die Funktionalität anderen zur Verfügung zu stellen, was hier
ja nicht der Fall ist, der Sinn ist ja ein anderer und nicht das Wrappen :wink: