ständiger RunDLL Fehler!!!!
-
Hallo an Alle,
ich habe ein riesiges Problem.
Ich bin gerade dabei einen Druckertreiber für Windows 98 zu programmieren.
Leider bekomme ich ständig RunDLL 32 Fehler, sobald ich die Eigenschaften des Treibers ein zweites Mal aufrufe. Ich habe die Property Sheets angepasst und diese funktionierten bisher auch einbahnfrei. Nun fügte ich eine Funktion hinzu, die aus einem INF-file bestimmte Eigenschaften auslest.
Seitdem kommt es ständig zu Fehlern.
Ich konnte jedoch feststellen, dass die Fehler nicht bei den Funktionsaufrufen geschieht, sondern wenn ich mit Strings arbeite.
Ich reserviere zuerst Speicher mit malloc() und gib ihn auch nachher wieder mit free() frei. Trotz alledem kommt es ab dem 2. Aufruf der Eigenschaften zu RunDLL-Fehlern.Mein Verdacht geht dahin, dass es sich um Speicherprobleme handelt!
Könnte ich mit meinem Verdacht richtig liegen??????Ich weiß einfach nicht weiter wie ich die Sache richtig anpacken soll.
Ich bin um jede eurer Hilfen dankbar.
-
Ich reserviere zuerst Speicher mit malloc() und gib ihn auch nachher wieder mit free() frei.
Was du dazwischen machst ist relevant. Sicher, dass sich da keine kleine Indexüberschreitung eingeschlichen hat?
Mein Verdacht geht dahin, dass es sich um Speicherprobleme handelt!
Könnte ich mit meinem Verdacht richtig liegen??????Sicher. Möglich ist alles nur Bestätigung wirst du hier keine finden können. Ohne relevante Codeschnipsel ist das alles nur stochern im Trüben.
-
Hier der Code:
DWORD MeinParsen() { int FormatCount, i, AWidth, AHeight, HIQTreshhold, LOQTreshhold, PGroup; unsigned long int SingleKeyBufferSize; unsigned long NameBufferSize, AllKeyBufferSize, UsedKeyBufferSize; DWORD ErrorState=0; DWORD RetVal= ERROR_SUCCESS; char *NumberBuffer, *temp, *ausgabe, *SectionNameBuffer, *SingleKeyBuffer, *AllKeyBuffer, *NameBuffer, *FullName; char KatBuffer[45]; size_t AKS, NS; PRODUKTE produkte; NameBufferSize = 255; FormatCount = GetPrivateProfileInt( (LPSTR)"INFO", "formatcount", 0, Pfad); temp = (char *) malloc(4); NumberBuffer = (char *) malloc (34); SingleKeyBuffer = (char *) malloc(256); AllKeyBuffer = (char *) malloc(256); NameBuffer = (char *) malloc(256); FullName = (char *) malloc(257); ausgabe = (char *) malloc(100); SectionNameBuffer = (char *) malloc(256); for (i=1; i<=FormatCount; i++) { wsprintf((LPSTR)temp, "%d", i); strcpy(NumberBuffer, temp); strcpy(AllKeyBuffer, ""); do { ErrorState=GetPrivateProfileString((LPSTR)NumberBuffer, (LPSTR)"name", (LPSTR)"", (LPSTR)NameBuffer, NameBufferSize, Pfad); } while (ErrorState!=0); AWidth = GetPrivateProfileInt((LPSTR)NumberBuffer, (LPSTR)"width", 0, (LPSTR)Pfad); AHeight = GetPrivateProfileInt((LPSTR)NumberBuffer, (LPSTR)"height", 0, (LPSTR)Pfad); HIQTreshhold = GetPrivateProfileInt((LPSTR)NumberBuffer, (LPSTR)"width", 40, (LPSTR)Pfad); LOQTreshhold = GetPrivateProfileInt((LPSTR)NumberBuffer, (LPSTR)"width", 20, (LPSTR)Pfad); wsprintf((LPSTR) ausgabe, "ProduktHeight: %d\n ProduktWidth: %d", AHeight, AWidth); MessageBox(NULL, ausgabe, NULL, MB_OK); AKS = 50; NS = strlen(NameBuffer); if (AKS>0) { strcpy(FullName, AllKeyBuffer); }else{ strcpy(FullName, NameBuffer); } strcpy(produkte.ProduktName, FullName); produkte.ProduktID = (int) i; produkte.PHeight = (int) AHeight; produkte.PWidth = (int) AWidth; } // For-Schleife Nr.1 free(NumberBuffer); free(temp); free(ausgabe); free(SectionNameBuffer); free(SingleKeyBuffer); free(AllKeyBuffer); free(NameBuffer); free(FullName); return (ERFOLGREICH); }
-
Das ist ja mal extra wirr.
Welchen Wertebereich hat FormatCount?
Warum castest du nach LPSTR an Stellen wo LPCTSTR erwartet wird?AKS = 50;
NS = strlen(NameBuffer);
if (AKS>0)
{
strcpy(FullName, AllKeyBuffer);
}else{
strcpy(FullName, NameBuffer);
}
produkte.ProduktID = (int) i;
produkte.PHeight = (int) AHeight;
produkte.PWidth = (int) AWidth;
Ich würde mal behaupten, dass du irgendwo eine Indexüberschreitung drin hast.
-
FormatCount ist in meinem Fall genau 30.
Warum castest du nach LPSTR an Stellen wo LPCTSTR erwartet wird?
Welche stellen meinst du da speziell?
Folgendes, für mich unerklärliches Problem.
LPSTR funktioniert einbahnfrei, allerdings LPCTSTR ist bei mir ein undeclared indentifier!!!!Das ist für mich irgendwie etwas strange!
-
Welche stellen meinst du da speziell?
Die Casts nach LPSTR sind alle samt überflüssig.
Genau wie die Casts nach int an der von mir mit einem
markierten Stelle.do
{
ErrorState=GetPrivateProfileString((LPSTR)NumberBuffer, (LPSTR)"name", (LPSTR)"", (LPSTR)NameBuffer, NameBufferSize, Pfad);} while (ErrorState!=0);
Verstehe ich nicht. GetPrivateProfileString liefert doch die Anzal der in den Ausgabepuffer kopierten Zeichen.
-
OK, ich habe nun alle Castings entfernt und die do-while kannst du vergessen!
Das war mein Fehler, dass ich die dummer Weise im Quelltext drinnengelassen hab.
Ich hatte nämlich davor mal was zu Testzwecken ausprobiert.Aber leider wieder der selbe Mist!
"RUNDLL32 verursachte eine allgemeine Schutzverletzung
in Modul KRNL386.EXE bei 0002:00003077.
Register:
EAX=00000020 CS=014f EIP=00003077 EFLGS=00000246
EBX=00008424 SS=0fb7 ESP=00008418 EBP=00008420
ECX=00000001 DS=2a27 ESI=0000ffff FS=0000
EDX=00002a27 ES=0000 EDI=00004874 GS=0000
Bytes bei CS:EIP:
87 4d 22 e3 00 c3 8b 3e 06 00 33 c9 87 4d 22 c3
Stapelwerte:
016f3118 2a27ffff 10ac842c 00043827 00a90020 0645848a ffff0004 ffff016f 00240000 00000000 00a30000 00002a27 00000000 00000000 00000000 00000000"Hättest du sonst noch Vorschläge, Anregungen .... Verbesserungen! *hundeblickaufsetz*
Danke trotzdem!!!!
-
Hallo,
in meinen Augen ist die Qualität des Codes zumindest fragwürdig.Ein paar Beispiele:
Du führst pro Schleifendurchlauf eine Zuweisung an ein PRODUKT-Objekt durch. Dieses wird aber nirgends benutzt. Es ist also völlig sinnlos.Du definierst die Variablen UsedKeyBufferSize, AllKeyBufferSize, PGroup, KatBuffer und SingleKeyBufferSize, benutzt sie aber nirgends.
AKS = 50; NS = strlen(NameBuffer); if (AKS>0) { strcpy(FullName, AllKeyBuffer); }else{ strcpy(FullName, NameBuffer); }Diese Bedingung ist völlig sinnlos. Du setzt AKS auf 50 und prüfst dann, ob es größer 0 ist. Das scheint in meinen Augen eine Tautologie zu sein.
Der Code ist äquivalent zu:
strcpy(FullName, AllKeyBuffer);Damit kannst du dann gleich auch noch NS und AKS rausschmeißen.
Und das sind nur einige Kritikpunkte.
Ich würde dir raten, den Code noch mal zu überdenken. Danach würde ich ihn aufräumen. Damit fertig, würde ich ein paar sinnvolle assertions einbauen. Damit kannst du schon mal testen, ob Indexüberschreitungen ein Problem sind.
Außerdem würde ich mir die für einen korrekten Durchlauf erwarteten Strings notieren und diese dann immer mit den tatschächlichen Ergebnissen vergleichen.
-
strcpy(produkte.ProduktName, FullName);
Was ist produkte.ProduktName? Ein Array, groß genug für FullName? Oder doch eher ein Zeiger, für den kein Speicher alloziert worden ist?
Ansonsten würd ich das ganze dynamische Speicherhandling kicken. Wenn du am Anfang der Funktion alles allozierst und am Ende wieder alles freigibst, reicht logischerweise auch automatischer Speicher (sprich: Arrays, die auf dem Stack liegen.)
-
Allerunterste Schublade!
@Moderator: Bitte löschen!
