Frage

Ich bin ein C ++ Win32-DLL mit einigen globalen Daten zu schaffen. Es gibt eine std :: map global definiert und es wird exportierten Funktionen in der DLL, die Schreibdaten in die Karte (nach einer Schreibsperre zu erwerben, natürlich).

Mein Problem ist, wenn ich die Schreibfunktion aus dem Inneren der DLL DllMain aufrufen, funktioniert es ohne Probleme. Aber wenn ich die DLL-Datei von einem anderen Programm laden und die Funktion aufrufen, die Daten in die globale Karte schreibt, es gibt mir diese Fehlermeldung:

WindowsError: exception: access violation reading 0x00000008

Gibt es etwas, das über das getan werden kann? Die gleiche Funktion, wenn sie von DllMain aufgerufen hat Zugriff auf die globalen Daten in den DLL, aber wenn sie von einem anderen Prozess genannt, macht es keinen Zugriff auf die globalen Daten. Bitte Beratung.

Ich bin mit dem TDM-MinGW gcc 4.4.0 Compiler.

EDIT: Ok, ich habe herausgefunden, was das Problem ist, und vielen Dank für die Hilfe Jungs, aber das Problem war nicht mit einem Konstruktor Problem oder Unfähigkeit Karten im globalen Raum zu haben, aber ein Problem in den boost :: Python, dass ich verwenden. Ich hatte es getestet, aber da ich die DLL aus Python oder vielleicht etwas nennen, das urllib2 Modul wurde nicht in die DLL geladen zu werden. Jetzt muss ich sehen, wie es zu beheben.

War es hilfreich?

Lösung

Sieht aus wie der Konstruktor von std::map hat noch nicht ausgeführt, wenn Ihr Code aufgerufen wurde. Lebensdauer des globalen Nicht-PODs in einer Win32-DLL ist ziemlich kompliziert, und ich bin nicht sicher, wie MinGW es speziell behandelt. Aber es kann sein, dass die Art und Weise Sie die DLL sind kompilieren, können Sie Ihre eigene Funktion (DllMain?) Festgelegt haben, als Einstiegspunkt, und somit overrode der CRT-Initialisierungsroutine, dass Anrufe Konstrukteuren.

Andere Tipps

Ein Lesefehler bei einer derart niedrigen Speicheradresse der Regel bedeutet, dass Sie versuchen, einen NULL-Zeiger irgendwo zuzugreifen. Können Sie Ihren eigentlichen Code zeigen?

Sie haben gemeinsam genutzten Speicher zu verwenden, da die verschiedenen Prozesse getrennte Adressräume haben. Ich denke, Sie werden nicht std :: map zum Laufen bringen. Ich würde mit MapViewOfFile, Create, OpenFileMapping, ... und nur alte Daten empfehlen. Fragen Sie Google / MSDN.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top