Problem mit CString in Verbindung mit DLL
-
Hi Leute,
Ich hab momentan ein ziemliches Problem und ich bin am Ende meiner Weisheit:
Ich hab in einer DLL (die die MFC verwendet) eine exportierte Funktion:__declspec(dllexport) int SetTmpPath(CString strPath);
Was im Funktionsrumpf steht ist unwichtig.
Naja, wenn ich SetTmpPath in meiner Anwendung, welche die DLL verwendet folgendermaßen aufruf:
CString strTmp = "C:\\Windows\\Temp"; SetTmpPath(strTmp);
passt alles.
Wenn ich sie aber so aufruf:
SetTmpPath("C:\\Windows\\Temp");
gibts nen Absturz ("HEAP[Testanwendung.exe]: Invalid Address specified to RtlValidateHeap( 890000, 925140 )"), wenn die Funktion zurückkehrt und das lokale CString-Objekt zerstört wird.
Ich weiss auch (teilweise) wieso es beim oberen nicht abstürzt:
CString arbeitet mit Refernzcounting, d.h., dass wenn man einem CString einen anderen zuweisst, beide auf den selben Speicher zeigen. Erst, wenn man einen der beiden ändert, wird neuer Speicher reserviert. Wenn ein CString-Objekt zerstört wird, dann wird der Speicher nur gelöscht, wenn kein anderes CString-Objekt mehr darauf zeigt. Deswegen wird im oberen Code der Speicher nciht gelöscht und es stürzt auch nicht ab.
Im unteren Code aber wird der Speicher gelöscht (ein einfaches delete[] pData;) und er stürzt ab.
Lange Rede, kurzer Sinn: Wieso ist die Adresse von pData ungültig?
Ich hoffe, jemand hat ne Ahnung, woran das liegen könnte.
Danke im Voraus.
-
Na weil du es bist.
Hast du in der Funktion vor dem ersten Befehl
AFX_MANAGE_STATE(AfxGetStaticModuleState());
geschrieben.
func(CString ksjdkjasd) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString test; BLA BLA }
-
Hi,
Danke für deine Antwort, aber das funktioniert leider auch nicht
Ausschnitt aus einem Kommentar am Anfang der DLL:
[cpp]
// Wird diese DLL dynamisch an die MFC-DLLs gebunden,
// muss bei allen von dieser DLL exportierten Funktionen,
// die MFC-Aufrufe durchführen, das Makro AFX_MANAGE_STATE
// direkt am Beginn der Funktion eingefügt sein.
//
// Beispiel:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // Hier normaler Funktionsrumpf
// }
//
// Es ist sehr wichtig, dass dieses Makro in jeder Funktion
// vor allen MFC-Aufrufen erscheint. Dies bedeutet, dass es
// als erste Anweisung innerhalb der Funktion ausgeführt werden
// muss, **sogar vor jeglichen Deklarationen von Objektvariablen,
**// da ihre Konstruktoren Aufrufe in die MFC-DLL generieren
// könnten.[/cpp]Die Parameter sind aber Variablen. Ich müsste es also irgendwie ausführen, bevor die Parameter erstellt werden ...