Referenz einer list aus dll an zweite dll übergeben



  • Moin moin,

    hab ein großes Problem. Ich habe eine Oberfläche in C# und zwei dll's in c++. Die kommunikation zwischen allen drei Elementen klappt auch eigentlich hervorragend.

    Nun möchte ich aber eine list< int > von der einen dll an die zweite dll per Referenz übergeben, dort mit Werten füllen und dann in der ersten dll die Werte wieder auslesen können.

    Nach dem return aus der zweiten dll stürzt er leider mit folgender Meldung ab:
    _CrtIsValidHeapPointer(pUserData)

    Hier mal der Code:

    dll 1:

    int funktion()
    {
    	list<int> list_to_fill;
    	DLL2_fill_List(list_to_fill);
    
            //Hier die Werte aus gefüllter list_to_fill auslesen...
    
    	return 0;
    }
    

    dll 2:

    DLL_API int DLL2_fill_List(list<int> &list_to_fill)
    {
    	int i;
    	for ( i = 0; i<100; i++ )
    		list_to_fill.push_back(i);
    	return i;
            //absturz nach diesem return
            //Meldung: _CrtIsValidHeapPointer(pUserData)
    }
    

    Kann mir bitte jemand erklären was ich dort falsch mache?
    Ich bin für jede Hile dankbar und hier schon am durchdrehen 😞



  • In C# ist std::list<T> (ich vermute mal Du benutzt diese Liste) unbekannt und kann auch nicht so einfach in die managed (C#) Welt gemappt werden.

    Ich vermute mal Du benutzt bis jetzt den P/Invoke Mechanismus (korrekt?) mit DllImport(..). Dann wäre es am einfachsten du würdest ein C- Array übergeben (Pointer und Länge), welches dann gefüllt werden kann.

    Simon

    Edit:
    Bei P/Invoke könnte folgendes Tool helfen:
    http://www.codeplex.com/clrinterop

    Edit2:
    Huch, habe gerade dass ich das wahrscheinlich falsch verstanden habe - dein Problem ist zwischen den beiden C++ Dll's, oder?



  • Nach meinem Edit2 habe ich ein paar Frage:

    1. Sind beide Dll's mit demselben Kompiler (auch die Version) kompiliert worden?
    2. Sinde beiden Dll's gegen dieselbe Runtime gelinkt worden (auch Release <> Debug gelten als unterschiedlich!).

    Simon



  • Hey, ja das Problem besteht zwischen den beiden dll's.

    Erstmal danke für die schnelle Antwort. 🙂

    Und die Fragen 1. und 2. kann ich leider auch nur mit Ja beantworten, das habe ich schon alles gecheckt.

    Das füllen der Daten funktioniert auch nicht mit Vector oder Map, das habe ich auch schon gestestet.



  • Hätte da noch eine Idee, bin mir aber nicht sicher ob das Problem hier wirklich Auftritt.

    Falls (da bin ich mir eben nicht sicher) die DLL's zwei verschiedene Heaps benutzen und die Implementation der std::list<T> geshared wird (wird sie, da std::list<T> ein Template ist) kann es sein, dass auf dem einen Heap alloziert wird und das Memory im anderen Heap versucht wird freizugeben.

    Drauf deutet auch das _CrtIsValidHeapPointer hin.
    http://msdn.microsoft.com/en-us/library/ys6cfhhh.aspx

    Abhilfe schafen würde da eine Liste, die nicht die Impl. sondern nur das Interface (alles pure virtuals) shared.

    BTW: das ist das falsche Forum, wüsste aber nicht wos besser ist, Visual C++ oder WINAPI.. also egal...



  • Melde mich erst jetzt wieder, hab dann gestern auch mal Feierabend gemacht :-),
    10 Std arbeiten reichen dann auch... 🙄

    theta schrieb:

    Abhilfe schafen würde da eine Liste, die nicht die Impl. sondern nur das Interface (alles pure virtuals) shared.

    Was wäre das denn für eine Liste, bzw. wie müsste ich das dann umsetzen?

    theta schrieb:

    BTW: das ist das falsche Forum, wüsste aber nicht wos besser ist, Visual C++ oder WINAPI.. also egal...

    Das natürlich doof, vielleicht kanns ja jemand ins richtige verschieben...?



  • So, ich habe das nun auf anderem Wege gelöst:

    Ich hab mir eine Struktur gebaut, die unter anderem einen Vector<int> hat.

    Diese Struktur ist in beiden Dll's bekannt.

    Als Rückgabewert der Funktion in der zweiten Dll hab ich einen Pointer auf eben diese Struktur genommen die innerhalb dieser Funktion gefüllt wird, so dass ich beim aufruf der Funktion aus der ersten Dll heraus einen Pointer auf die Funktion mit den Werten erhalte.

    Mann muss nur darauf auchten, das man auch alles wieder schön mit delete entfernt.

    Weiß nicht so richtig ob das schön ist, aber es funzt super. 🙂

    Wobei mich ein anderer Lösungsweg immernoch interessieren würde.

    Aber erstmal vielen Dank für die Mithilfe!!

    Wie stell ich den thread denn nu auf gelöst um?



  • Mann muss nur darauf auchten, das man auch alles wieder schön mit delete entfernt.

    Und wichtig, delete dort aufrufen, wo auch das new gemacht wurde.


Anmelden zum Antworten