TWAIN-Scantool stürzt ab
-
Ich brauche eure Hilfe bei einem etwas blöden Problem.
Meine Anwendung schmiert mir mit der Meldung:"Die Anweisung in "0x7c921e58" verweist auf Speicher in "0x2d53465c".
Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.beim Beenden ab.
Mit dem Debugger habe ich rausgefunden, dass in der
afxstate.cpp beim Programmstart auf folgende Zeile
verwiesen wird:#undef AfxWndProc LRESULT CALLBACK AfxWndProcBase(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { AFX_MANAGE_STATE(_afxBaseModuleState.GetData()); ->>> return AfxWndProc(hWnd, nMsg, wParam, lParam); }Fahre ich mit dem Debugger dann fort, öffnet sich meine Anwendung.
Ich kann sie auch ganz normal bedienen. Lediglich beim Beenden stelle
ich dann wieder Probleme fest:Und zwar in der free.c an dieser Stelle
#endif /* CRTDLL */ else // __active_heap == __SYSTEM_HEAP #endif /* _WIN64 */ { HeapFree(_crtheap, 0, pBlock); } -->>> }Ich bin absolut ratlos wie ich nun vorgehen soll.
Es handelt sich um ein Programm, dass den Scanner
anspricht (TWAIN).Es wird beim Programmstart der einzige vorhandene Scanner
autom. gewählt. Schließe ich den Scanner nicht an den PC
an, stürzt mir auch die Anwendung nicht ab.Auch im Debugger sieht dann alles i.O. aus.

-
Hallo,
ich bin mir nicht 100% sicher, aber ich vermute das Problem entsteht
durch meinen Code, der mir die Drucker enumerieren soll:UINT CPrinterAccess::EnumPrinter(IEnumPrinter* pEnumPrinter) const { DWORD nSize; DWORD nPrinterCount; BYTE* prInfo = new BYTE[nSize]; PRINTER_INFO_4* pPrinterInfo = NULL; ::EnumPrinters(PRINTER_ENUM_FAVORITE | PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &nSize, &nPrinterCount); if (pEnumPrinter) { if (::EnumPrinters(PRINTER_ENUM_FAVORITE | PRINTER_ENUM_LOCAL, NULL, 4, prInfo, nSize, &nSize, &nPrinterCount)) { pPrinterInfo = (PRINTER_INFO_4*)prInfo; for (DWORD i = 0; i < nPrinterCount; i++) if (!pEnumPrinter->OnEnumPrinterName(pPrinterInfo[i].pPrinterName)) break; } delete[] prInfo; } return nPrinterCount; }Wenn ich diesen Code verwende, um nur loakle Drucker zu suchen, habe ich
keine Probleme mit meiner Anwendung:UINT CPrinterAccess::EnumPrinter(IEnumPrinter* pEnumPrinter) const { DWORD nSize; DWORD nPrinterCount; ::EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 1, NULL, 0, &nSize, &nPrinterCount); if (pEnumPrinter) { BYTE* prInfo = new BYTE[nSize]; if (::EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 1, prInfo, nSize, &nSize, &nPrinterCount)) { PRINTER_INFO_1* pPrinterInfo = (PRINTER_INFO_1*)prInfo; for (DWORD i = 0; i < nPrinterCount; i++) if (!pEnumPrinter->OnEnumPrinterName(pPrinterInfo[i].pName)) break; } delete[] prInfo; } return nPrinterCount; }Ich kann jedoch keinen Fehler dabei erkennen

-
Hat sich jemand von euch mal die Zeit nehmen können zu prüfen,
ob ich die Funktion mit PRINTER_INFO_4* überhaupt richtig verwende?Ich würde mich über Feedback freuen, da ich irgendwie den Wald
vor lauter Bäumen nicht mehr sehe...
Muss ich noch irgendwo ein free oder delete setzen?
Und warum meckert Windows wegen "read" in irgendeinem Speicherbereich rum