fopen_s returned mit EMFILE "Too many open files"
-
Servus,
nachdem ich ja in die .Net Sparte gerutscht bin, habe ich gerade ein tierisches Problem diesen Fehler zu interpretieren. Ich habe mir eine native DLL gebastelt die folgende Methode exportiert:
#define DECLDIR __declspec(dllexport) DECLDIR BOOL IsValid() { FILE* hFile; errno_t err = fopen_s(&hFile, "C:\\test.txt", "r"); if ( err != 0 ) return FALSE; if ( hFile == NULL ) return FALSE; size_t count, total = 0; UCHAR buffer[1024]; while( !feof( hFile ) ) { count = fread( buffer, sizeof( UCHAR ), 1024, hFile ); if( ferror( hFile ) ) break; total += count; } fclose(hFile); return FALSE; }In meinem .Net Teil rufe ich die DLL per P/Invoke wie folgt auf:
[DllImport("test.dll", EntryPoint = "IsValid")] internal static extern bool IsValid(); private void Foo() { bool res = IsValid(); }Als "errno_t" liefert er mir aber dauerhaft 0x18 (24) EMFILE "Too many open files" zurück. Ich kann mir gerade nicht erklären warum er das macht. Der Aufruf findet einmal statt und das nur nach Programmstart nach einem ButtonClick.
Hat vielleicht einer eine Idee?
gruß
HellsgoreEDIT: Ich arbeite auf einem Window 7 64Bit BS. Vielleicht gibt ja irgendwelche Probleme mit irgendwelchen Rechten...
-
Die CRT erlaubt die ein maximum an 512 Streams zu öffnen. Davon gehen noch stdout, stdin, stderr ab, Bleibeb 509.
Der Fehler den Du bekommst deutet darauf hin, dass Du mehr Objekte erzeugst.
Evtl. wird Deine Ressource in .NET nicht entsorgt (GC) und deshalb bleiben im nativen Beeich Dateien offen.
-
Das dürfte hier nicht passieren, da er ja wieder ein fclose macht... es sei dennm es tritt eine Exception auf...
-
@Martin:
Ich würde die ja Recht geben wenn ich nicht wüsste, dass ich nichts Anderes mache außer diesen einen einzigen Aufruf nach Programmstart. Es passiert halt wirklich überhaupt nichts davor. Es ist ein banales 10 Zeilen Testprogramm...@Jochen:
Leider nein, keine Exception fliegt mir hier um die Ohren. Er liefert mir nur ein EMFILE als errno zurück. Mehr passiert nicht. Es ist auch egal, welche Datei ich angebe...