2009-06-23 9 views
1

Ich wurde mit einer C++ - DLL und zugehörigen Header-Datei zur Verfügung gestellt, um es mit meiner Anwendung zu integrieren. Zunächst versuche ich einfach, die DLL aus einer einfachen Win32-Konsolenanwendung aufzurufen (ich verwende Visual Studio 2008 Express).C++ - Verknüpfung zu 3rd Party DLL - intermittierende Zugriffsverletzung

Ich habe die DLL verknüpft, indem Sie es als zusätzliche Abhängigkeit in den Projekteinstellungen angeben.

Die Schnittstelle (d. H. Die einzige exportierte Funktion) gibt einfach einen Zeiger auf eine Instanz der Klasse zurück, die ich tatsächlich aufrufen muss. Ich kann das erfolgreich aufrufen, den Zeiger holen und die erste Funktion aufrufen, die ich brauche (eine "Init" -Funktion).

Wenn ich komme, um die Funktion, die tatsächlich die Verarbeitung, die ich benötige, aufzurufen, bekomme ich intermittierend einen "0xC0000005: Zugriffsverletzung lesen Speicherort ...." Fehler. Das heißt, ich führe das Programm aus - es funktioniert erfolgreich und beendet - ich versuche, es erneut auszuführen (nichts zu ändern - alle Parameter sind fest codiert) und erhalte den Fehler (und mache es weiterhin).

Ich kann das Problem nicht ständig neu erstellen, aber ich beginne zu denken, dass es etwas mit der DLL nicht ordnungsgemäß entladen - nachdem ich den Fehler bei einer Gelegenheit versucht habe versucht, löschen die DLL und wurde von erzählt Windows, dass es verwendet wurde. Das heißt, bei einer anderen Gelegenheit war ich in der Lage, die DLL zu löschen, nachdem der Fehler erhalten wurde, kopieren Sie es zurück, und bekam dann den Fehler beim nächsten Lauf.

Sollte die DLL korrekt entladen werden, wenn meine .exe beendet? Wäre es besser, wenn ich versuche, die DLL explizit zu laden/zu entladen, anstatt sie implizit auszuführen?

Jede andere Hilfe oder Beratung sehr geschätzt.

+0

Dies ist eine sehr allgemeine Frage - können Sie Code oder Dokumentation jeglicher Art eingeben? – Tim

+1

Tritt dies im Debugger auf? Oder, wenn es passiert, warum hängen Sie keinen Debugger an und schauen sich den Call-Stack an? – MSN

Antwort

1

Es wird nichts mit dem Entladen der DLL zu tun haben; Verschiedene Prozesse, die dieselbe DLL verwenden, teilen keinen Status. Außerdem wird die DLL entladen, wenn der Prozess beendet wird. vielleicht nicht anmutig, aber es wird entladen.

Ich kann mir zwei mögliche Gründe für einen intermittierenden Ausfall vorstellen.

Höchstwahrscheinlich hat die DLL eine Race-Bedingung. Dies könnte eine sein, die offengelegt wird, wenn die DLL zwischengespeichert wurde, wodurch sich das Timing ändert. Das würde erklären, warum dein erster Lauf nicht fehlgeschlagen ist, aber die folgenden.

Ich denke, es ist auch möglich, dass die DLL seine Sperre für eine Datei nicht freigegeben hat. Wenn auf eine Datei, auf die Sie durch diese DLL zugreifen, zugegriffen wird, überprüfen Sie, ob diese Datei nach dem Ende des Prozesses gesperrt ist.

Holen Sie sich das auch in einem Debugger. Aktivieren Sie die Ausnahmen der ersten Chance im Visual Studio und schauen Sie sich den Callstack an, in dem der AV stattfindet, und veröffentlichen Sie ihn hier.

+0

Der Callstack zeigt: "my.exe! Wmain (int argc = 1, wchar_t * * argv = 0x00981ad0) Zeile 96 + 0xed Bytes C++". Ich nehme an, der Callstack wird mir nicht wirklich viel geben, da ich Code anrufe, für den ich eigentlich keine Quelle habe? – William

1

Welche Typen sind in den Klassen enthalten, die von der DLL exportiert werden? Wir hatten oft solche Probleme mit Visual Studio, wenn die Klassen STL verwenden - ich würde vermuten, dass jede Vorlagenverwendung wahrscheinlich ein Weg wäre, um diese Art von Problem zu verursachen.

1

Was ist Ihre Einstellung für "Runtime-Bibliothek" unter "C/C++" in den Konfigurationseigenschaften?
Sie sollten wahrscheinlich/MD versuchen (oder/MDd zum Debuggen).
siehe http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx

+0

Danke. Habe gerade meinen Arbeitslaptop gestartet, um einen Blick darauf zu werfen. Es war/MTd. Ich habe es in/MD geändert und neu aufgebaut. Ich habe dann das Programm 3 Mal hintereinander erfolgreich ausgeführt und dachte, das Problem sei gelöst. Dann zum 4. Mal habe ich noch einmal die Zugriffsverletzung bekommen! – William