Speicherverwaltungs Dll & Bedingungen


  • Mod

    Hallo

    warum eine Datei schreiben usw.....

    es gibt doch CallByRef

    MfG
    Klaus



  • @xy: Was gibts da zu erklären? Nach einem delete wird der Speicher freigegeben, das heisst, anders ausgedrückt, die Daten auf die der Zeiger zeigt (geile kombo) sind nicht mehr konsistent und können jederzeit überschrieben werden => Zeiger wird ungültig. Da nun aber ein normaler PC soviel speicher hat, sind die Daten in den häufigsten Fällen noch lesbar.

    @Maffe: zu umständlich. Wieso nicht einfach einen Zeigerszeiger übergeben und innerhalb der DLL dann Speicher reservieren, und dann den String kopieren? Problem: Es darf dann nicht vergessen werden den Speicher wieder freizugeben.

    Oder einfach die WinAPI-Variante: Die Funktion erwartet einen Puffer mit einer maximalen Länge und liefert die Anzahl Zeichen zurück die sie gebraucht hätte. So kann man die Funktion aufrufen mit einem Zeiger auf NULL, die Länge die benötigt wird ermitteln und anschliessend die Funktion nochmals mit Puffer aufrufen. Zum Beispiel.

    -junix

    <edit>Call by Reference wie KlausB es beschrieben hat wäre natürlich auch ne Variante (o:</edit>



  • Die Zeigerszeiger-Idee finde ich am besten. Schade, dass ich nicht daran gedacht habe. 🙂



  • Vielen Dank für die Vorschläge.
    Ich schaue mal, wie ich das realisieren kann. (ehrlich gesagt, habe ich so etwas noch nie gemacht)

    MfG
    xy



  • Maffe001 schrieb:

    Die Zeigerszeiger-Idee finde ich am besten.

    Ich nicht. Die Gefahr für Speicherlöcher ist definitv am höchsten.

    @xy: tja, das ist das Schicksal eines Entwicklers, dass er sich immer wieder mit dingen konfrontiert sieht, die er noch nie gemacht hat..

    -junix



  • Aber wenn man da von Anfang an hinterher ist und gleich immer wieder alles freigibt, wenn man es nicht mehr braucht, dann ist das doch ne feine Sache. Oder etwa nicht? 😕



  • Klar. Ist einfach ne Problem-/Fehlerquelle mehr welche man sich da schafft. Mir persönlich gefällt das WinAPI system am besten.

    -junix



  • Hallo nochmal,

    Entschuldigung, aber ich hatte mich mit dem "Teilproblem" zu sehr beschäftigt, daß ich einen wichtigen Punkt vergessen habe.

    Die DLL wird weitergegeben und von einem nicht von mir geschriebenen PERL-Programm genutzt. Meiner DLL sollte einen Datei-Pfad übergeben werden. Sie kontrolliert die Existens der Datei, liest und bearbeitet sie, und am Ende als String zurückgibt. Der Rückgabestring wird dann vom PERL-Programm weiter bearbeitet. So ist eigentlich das Ganze. Deshalb möchte ich schon gerne, daß meine DLL nur mit dem einen AnsiString-Parameter (Pfad der zu bearbeitenden Datei) aufgerufen wird.

    Und weil ich dabei das Problem mit dem AnsiString bekommen habe, dachte ich, ich versuche "nur" dieses Problem zu "verstehen" und zu lösen. Denn alles andere läuft eigentlich schon. Und wenn ich herausfinden könnte, wie ich diesen AnsiString zurückgeben kann, dann wäre mein Problem eigentlich gelöst.

    Könnt Ihr mich verstehen?
    MfG
    xy



  • PERL kennt aber keinen AnsiString?

    -junix



  • junix schrieb:

    PERL kennt aber keinen AnsiString?

    -junix

    Da ich das selbe Problem habe, wenn ich String staat AnsiString verwende, wollte ich das Problem mit AnsiString lösen. Meine DLL-Funktion sieht dann folgendermassen aus:

    String WINAPI TestAnsiString(String sPfad)
    {
      //...
    }
    

    Ich kann doch String für AnsiString benutzen, oder?

    Danke
    xy



  • äh String ist per Typedef AnsiString also macht das null unterschied. Aber vielleicht nochmals zum Mitschreiben für Analphabeten: PERL kennt keine AnsiStrings wie soll Perl also diese verarbeiten?

    -junix



  • junix schrieb:

    Aber vielleicht nochmals zum Mitschreiben für Analphabeten

    Ich weiß nicht, warum Du Deine Hilfe unbedingt mit Beleidigung verbinden willst. Kannst Du nicht einfach helfen und nett sein zugleich?!

    Nun, ob PERL mit meinem zurückgelieferten String was anfangen kann oder nicht, ist eine andere Sache, mit der ich mich "noch nicht" auseinandersetzen möchte. Mir geht es im Moment darum, eine DLL zu programmieren, die einen String (AnsiString) zurückliefert. Dies aber bereitet mir Probleme, weil es einfach nicht fehlerfrei funktioniert, egal ob und wo ich die memmgr.lib einbinde (wie im Hinweis beschrieben). Kannst Du mir bitte da weiter helfen, ohne mich zu beleidigen?! Danke!
    (Und was den anderen Ding mit PERL angeht: Wenn er geboren wird, dann kriegt er auch einen Namen)

    MfG
    xy



  • Dies ist ein Standard Ausspruch von mir, wenn ich mich zum n-ten mal wiederhole. Wenn du jeden quark gleich als Beleidigung auffassen willst... bitte.

    Was das Problem betrifft, so sehe ich dich da ein Problem schaffen, wo du eigentlich bei der Lösung deines Problems auf gar keins stösst...

    -junix



  • junix schrieb:

    Dies ist ein Standard Ausspruch von mir, wenn ich mich zum n-ten mal wiederhole. Wenn du jeden quark gleich als Beleidigung auffassen willst... bitte.

    Entschuldigung angenommen...

    junix schrieb:

    Was das Problem betrifft, so sehe ich dich da ein Problem schaffen, wo du eigentlich bei der Lösung deines Problems auf gar keins stösst...

    Ich verstehe, worauf Du hinaus willst, weiß allerdings nicht, wie ich das Problem umgehen soll. Kannst Du es mir bitte sagen?

    Danke
    xy



  • Abzweigung auf die Umfahrung: Definiere, bzw. informiere dich, wie das PERL Script und deine DLL Strings austauschen (können). Was mir nicht klar ist: Wie wird die DLL denn im Perl Script eingebunden?

    -junix



  • Wie die DLL im PERL-Programm eingebunden wird, weiß ich schon, und hab es auch erfolgreich getestet (zwar mit Integer, aber für Strings gibt es auch da eine Möglichkeit).
    Schau mal bitte Hier:
    http://www.c-plusplus.net/forum/viewtopic.php?t=66162

    MfG
    xy


Anmelden zum Antworten