Problem mit std::string& als Argument



  • Hallole.

    Ich habe eine Funktion der ich ein std::string& übergebe.
    In dieser Funktion schreibe ich in den String was rein und werte diesen danach aus, also so:

    //Deklaration:
    
    FKT_comm(std::string&);
    
    //Definition:
    
    FKT_comm(std::string &back)
    {
    back="LALALAL";
    }
    
    //Aufruf:
    std::string gibsmir;
    
    FKT_comm(gibsmir);
    
    cout << gibtsmir <<endl;
    

    So.

    Ich habe das in meinen Projekt schon oft so gemacht und das funktioniert auch.
    In diesem Fall ist die Funktion FKT_comm in einer anderen DLL.

    Diese Importiere ich natürlich ordnungegemäß und kann sie ja nachher so aufrufen wie wenn Sie innerhalb meines Projektes wäre.

    Nur bekomme beim Aufruf der Funktion nen Fehler.
    D.h. Innnerhalb der Funktion ist alles prima, alles funktioniert, nur beim Rückkehren meckert mich der Compiler beim Debuggen an.

    Teste ich es ohne Debugger läuft es durch stürzt dann aber irgendwann unerklärlich ab.

    Ich denke es ist ein Speicherproblem, aber wie soll ich es denn machen?
    Warum funktioniert es wenn ich funktionen innehrhalb des Projektes habe und mit eine Funktion in ner anderen DLL nicht?

    Hier die Fehlermeldung:

    In der Datei "xmemory" an der Stelle:

    void deallocate(pointer _Ptr, size_type)
    		{	// deallocate object at _Ptr, ignore size
    	[b]--->	[/b]::operator delete(_Ptr);
    		}
    

    Fehlermeldung vom Compiler:

    HEAP[server.exe]: Invalid Address specified to RtlFreeHeap( 01B00000, 01AC3140 )
    Windows hat einen Haltepunkt in server.exe ausgelöst.
    
    Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf ein Problem in server.exe oder in einer der geladenen DLLs hin.
    

    Das, was in der Funktion gemacht wird, steht in _Prt drin, soweit also ok, nur kann er sie nicht freigeben oder was ist das PRoblem?

    Ich hoffe es kann mir jemand helfen, Grüße Mondmann



  • gegen die dll-version der laufzeitbibliothek linken



  • Könntest du das etwas genauer beschreiben?
    Ich weiß nicht genau wie du das meinst.
    Also ich hab die "blabla.dll" die irgendwo rumliegt.
    Die muss ich einbinden?

    Wo denn ? Ich meine unter "Eingabe" kann ich ja nur "libs" angeben, schmeiß ich da die DLL rein kommt "lesefehler".
    Ich hatte das Ganze auf dieselbe Weise bisher gemacht, anstatt mit string& mit char** back;
    Und das hat einwandfrei funktioniert ohne daß ich die DLL irgendwo gelinkt habe:-)

    Möchte nochmal darstellen wie ich die DLL importiere vielleicht liegts auch am falschen Aufruf:

    Also im Projekt:

    if((hWterm = LoadLibrary(WIdll))==NULL)
     {   
    if((FKT_comm_str = (int (__stdcall *)(char* ,std::string,_EXTENSION_CONTROL_BLOCK * ,BENUTZER* ,std::string& ,int Flag)) GetProcAddress(hWterm,"FKT_comm_str")) == NULL)
    {
    ....
    }
    
    }
    

    Die Deklaration im Projekt:

    int (__stdcall *FKT_comm_str)(char* ,std::string,_EXTENSION_CONTROL_BLOCK * ,BENUTZER* ,std::string& ,int Flag);
    

    In der DLL:

    .......
    
    int WINAPI FKT_comm_str(char* ausweis ,std::string anfrage,_EXTENSION_CONTROL_BLOCK * pECB2,BENUTZER* bn,std::string &back ,int Flag)
    
    }
    

    Wozu ich das WINAPI drinhabe weiß ich nicht,aber an irgendeinem von den dreien wird wohl liegen.
    Vielleicht am _sdtcall??
    Oder Am WINAPI in der DLL?

    Ich habe die Funktion natürlich in der *.def exportiert.

    Hat jemand ne Idee?



  • Sind das Programm und die dll mit unterschiedlichen Compilern erstellt worden?



  • Nein, beide hab ich mit demselben, VC++ Express erstellt, von Grund auf.

    Wo könnte denn das Problem sein?

    Danke Mondmann



  • Hat keiner eine Idee?
    Sollte echt dringend Hilfe haben:-)

    Grüße Mondmann



  • Ich habs jetzt mir verschiedenen Aufrufkonventsionen versucht und auch mit einem Original Microsoft Beispiel.
    Genau dasselbe.

    Könnte es sein, daß das mit std::string gar nicht geht?
    Liegt es daran?

    Mondmann



  • Hallo Mondmann,

    Da es hier nicht um Standard C++, sondern um DLL-Aufrufe geht, gehört die Frage eher ins WINAPI-Forum.
    Generell ist die DLL-Schnittstelle nur für C-Funktionen gedacht. Das Du auch Klassen verwenden kannst, ist eine compilerspezifische Erweiterung. Du musst aufpassen, dass Du sowohl die DLL als auch die aufrufende Anwendung mit dem gleichen Compiler erstellst und jeweils auch wirklich die gleichen Klassendefinitionen verewendet werden. (std::string ist eine in der STL definierte Klasse).
    Du hast noch ein Problem:
    Normalerweise verwenden die DLL und die Anwendung getrennte Heap-Speicherbereiche. D.h. wenn Du Speicher im Code der DLL mit new reservierst, kannst Du das Objekt zwar in der Anwendung verwenden, das delete für dieses Objekt muss aber wieder im Code der DLL stehen. Anders herum ist es genauso. Ich vermute mal, dass std::string bei der Zuweisung in Deiner DLL-Funktion intern new und delete verwendet.
    Das heißt, Du solltest Klassen in der DLL-Schnittstelle verwmeiden, wenn Du nicht genau weisst, was intern passiert. Ob es dafür eine andere Lösung gibt, weiss ich nicht. Evtl. gibt es da ein paar Tricks mit den MFC-DLLs.

    DJohn

    EDIT: Die Rechtschreibung



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Such in den Projektoptionen nach einer Option wo du die Laufzeitbibliothek einstellen kannst. Dort wählst du Multithreaded-(Debug)-DLL aus in beiden Projekten.


Log in to reply