In DLL reservierten Speicher freigeben

Anfängerfragen zum Programmieren mit PureBasic.
teejex
Beiträge: 44
Registriert: 30.03.2009 17:55
Computerausstattung: PB4.40 Pro
C++: MinGW :)
Java: Eclipse :)
Notepad++ :)
--
Notebook/eher Mobile Workstation :D : Q9800 - nVidia - 4GB Ram - 500GB HD

In DLL reservierten Speicher freigeben

Beitrag 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
我是单洋。
我是德国人。
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: In DLL reservierten Speicher freigeben

Beitrag 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!
Zuletzt geändert von ts-soft am 15.03.2010 18:11, insgesamt 1-mal geändert.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: In DLL reservierten Speicher freigeben

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: In DLL reservierten Speicher freigeben

Beitrag 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.
Zuletzt geändert von DarkDragon am 15.03.2010 18:34, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: In DLL reservierten Speicher freigeben

Beitrag von Josh »

reserviere in deinem hauptprogramm den speicher, übergib der dll einen pointer darauf und lass die dll in diesen speicher reinschreiben.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: In DLL reservierten Speicher freigeben

Beitrag 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.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: In DLL reservierten Speicher freigeben

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: In DLL reservierten Speicher freigeben

Beitrag 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:
Antworten