2016-05-12 9 views
2

Die Situation ist einfach. Ich öffne Datei in einer DLL (DLL1) und schließe sie in einer anderen (DLL2). Ich rufe beide DLLs eine nach der anderen in Python-Skript, wird der Code wie folgt vor:C++ & Python schließen und öffnen Sie Dateien in verschiedenen DLL

from ctypes import * 

DLLFP1=r"C:\Workspaces\CPP\Test\build\files1.dll" 
DLLFP2=r"C:\Workspaces\CPP\Test\build\files2.dll" 
DLL1=cdll.LoadLibrary(DLLFP1) 
DLL2=cdll.LoadLibrary(DLLFP2) 

cppobj=c_void_p() 
DLL1.open(byref(cppobj)) 

DLL2.close(cppobj) 

DLL1 Code:

#define DLLEXPORT extern "C" __declspec(dllexport) 

DLLEXPORT void open(ofstream* &f){ 
    f = new ofstream(); 
    string FP("c:\\teest.log"); 
    f->open(FP); 
} 

und DLL2 Code:

#define DLLEXPORT extern "C" __declspec(dllexport) 

DLLEXPORT void close(ofstream* f){ 
    f->close(); 
} 

Im Ergebnis habe ich "Zugriffsverletzung schreiben". Ich kann normalerweise auch Text in Datei von DLL2 schreiben und wenn ich schließen Funktion zu DLL1 funktioniert es gut. Ich benutze Intel Compiler. Betriebssystem ist Windows7.

Die Frage ist, was ist los? Was ist der richtige Weg, um Dateien zwischen DLLs zu teilen?

Vielen Dank im Voraus.

+0

Zugehörige: [Did C++ 11 Adresse betrifft die Übergabe von Std Lib-Objekten zwischen dynamischen/gemeinsamen Bibliothek Grenzen?] (Http://programmers.stackexchange.com/questions/176681/did-c11-address-concerns- passing-std-lib-objects-between-dynamic-shared-librar) – robyschek

+0

Versuchen Sie, die beiden DLLs mit dynamischer C-Laufzeit zu verbinden, mit MS cl.exe ist es '/ MD 'Schalter – robyschek

+0

Ich habe versucht, leider tut es nicht' t helfen. –

Antwort

0

Dies kann, es sei denn DLL1 und DLL2 für die gleiche Laufzeit gebaut werden in Beziehung gesetzt werden: Potential Errors Passing CRT Objects Across DLL Boundaries

Wenn Sie passieren C Run-Time (CRT) Objekte wie Datei-Handles, Lokale, und Umgebungsvariablen in oder aus einer DLL (Funktionsaufrufe über der DLL-Grenze), unerwartetes Verhalten kann auftreten, wenn die DLL, sowie als Dateien in die DLL aufrufen, verschiedene Kopien der CRT -Bibliotheken verwenden.

Verwandte Themen