string & dll



  • seit ich die string klasse per klassenexport dllübergreifend verwende hab ich einige laufzeitfehler die ich mir nicht erklärn kann

    z.b. NoValidHeapPointer breakpoints bei einfachen zuweisungen mit dem = operator...

    gibts zum thema string&dll irgendwelche troubleshooting faqs oder tips



  • Du könntest eventuell damit Probleme haben das die Strings auf jedem Compiler anderst aussehen können und die DLL nicht das bekommt was sie eigentlich binär erwarten würde.



  • Ich bekomme jedesmal wenn ich strings in Dlls nutze ne Warnung, dass string keine Dll-Schnittstelle hat, vielliecht liegts daran???

    mfg
    Glamdring



  • in DLLs nur C-Typen exportieren. Strings sind Klassen -> nix dll.
    Verwende char*!
    Evtl. kannst Du auch Klassen exportieren, wenn Du die DLL und Applikation mit demselben Compiler schreibst. Dann musst Du aber auch aufpassen, dass beide dieselben Compilereinstellungen etc. haben. Instgesamt nicht das, was man normalerweise mit ner DLL bezwecken will



  • Desweiteren muss Speicher der in der Dll alociert wurde auch dort wieder freigegen werden.

    Generel ist es zu empfehlen Dlls ein C Interface zuverpassen und anschließend eine Wrapper Klasse in ein Header zu schreiben das du in deine Application einfügst. (ganz einfach wenn du mit Handles arbeitest)

    Allerdings ist es nicht völlig unmöglich Klassen als Parameter zu nehmen oder zurück zu geben und einiger Masen sicher zu sein, dass die meisten Compiler damit umzugehen wissen. Das Zauberwort heißt abstrakte Basis Klasse. Beinahe alle Kompiler implementiren die Vtables gleich. Also die 4 ersten Bytes einer Instance zeigen auf den Vtable und im Vtable sind die Methoden Pointer in der Rheienfolge wie sie in der Klasse declariert wurden.

    Also du schreibst eine Basis Klasse die nur virtuel Member hat. Danach leitest du eine Klasse davon ab fügst Membervariablen hinzu und overridest alle Funktionen (kannst auch neue virtuele declarieren da diese an das Ende des Vtables kommen).

    So nun musst du nur noch aufpassen, dass eine Klasse in dem Module (Application oder Dll) vernichtet wird in dem sie erschaffen wurde und, dass zwischen den Modulen nur Pointer (oder Referenzen) auf die Basis Klasse hin und her gehen. Jedes Module wird bei einem Funktionsaufruf im Vtable nachschauen und automatisch die Funktion des Modules aufrufen, das die Klasse gebaut hat.



  • Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum WinAPI verschoben.

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

    Dieses Posting wurde automatisch erzeugt.


Log in to reply