Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Am Verzweifeln: DLL die Zeichenfolge zurückgibt

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.11.2004, 10:13 Uhr
~Steffen
Gast


Hallo auch. Ich habe bisher hier im Forum keine brauchbare Lösung zu meinem Problem gefunden. Das Thema wurde zwar oft angesprochen, aber irgendie kam selten was raus.

Also: Eine Dll Funktion soll an das Hauptprogramm einen String char[...] oder auch string zurückgeben, dass Problem ist nur: Der Speicher soll dynamisch allokiert werden, d.h. die Größe der Ausgabe der DLL ist unbekannt und soll auch nicht durch eine Bufferlänge seitens des Hauptprogrammes beschränkt sein.

Normalerweise kommt man da schnell auf die Idee mit Zeigern, aber alles was ich versuche funktioniert einfach nicht:

Die Dll Funktion:


C++:
char* WINAPI TESTCOMMAND3(string *p1,string *p2, string *p3, LPDWORD datalen)
{
    string internalbuff;
    int i;
    char* res;

    for (i=0;i<22330;i++)
    {
        internalbuff.append("TEST\n");
    }
    *datalen = internalbuff.length();
    res = new char[internalbuff.length()+1];
    strcpy(res,internalbuff.c_str());
    return res;
}



und der Aufruf im Hauptprogramm:


C++:
    string str1,str2,str3;
    char* strres;
    DWORD len;
    
    if (mod)
        {    
                dllfnc = (DLLFUNCTION)GetProcAddress(mod,"TESTCOMMAND3");
        if (dllfnc)
                {
            strres = dllfnc(NULL,NULL,NULL,&len);
                }
            ...

        //strres ausgeben...

    delete [len+1] strres;
    strres=NULL;
    FreeLibrary(mod);        



So. Nach dem Schema hats bisher im Release Mode compilt funktioniert. Nun hab ichs mal im Debug erstellt, da gabs einen Assertion Fehler:

_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

der mir nix sagt. Kann mir jemand weiterhelfen? Das kann doch alles gar nich so schwer sein?

Gruß Steffen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.11.2004, 10:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das "aufräumen" deines zeigers ist dann nicht erlaubt, delete[] strres; schlägt fehl und bringt dir die obige Assertion. Evtl hilft hier ein "kleiner" Trick:

globalen pointer in der dll, und dann eine funktion (eben deine dll-funktion) die den speicher anlegt. und eine weitere dll-funktion, die einfach nur das delete[] strres; ausführt, welche du dann von deinem hauptprogramm aus ausführst
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.11.2004, 14:50 Uhr
~Steffen
Gast


...bin gerade genau auf die gleiche Idee gekommen. Haut sogar hin!

Nun mal noch ne Frage: Wie kann ich feststellen, ob durch das delete auch tatsächlich der Speicher wieder korrekt frei gegeben wird?
Im Taskmanager ist zwar zu sehen, wie der Speicherbedarf der Anwendung zwischenzeitlich (mit ein paar Sleeps(..) sichtbar) ansteigt, und nach dem delete wieder sinkt, aber es ist danach sogar MEHR frei als vorher. Nicht das da was schiefläuft?? Aber wenns im Debugmode nicht meckert, wirds schon passen.

Gruß
Steffen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.11.2004, 22:53 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


obs nun wirklich freigegeben ist kannste nicht nachprüfen, da das windows verwaltet. Wenn das scheisse baut, kann man nix machen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: