CString Assertion bzw. CreateDialogIndirect
-
Hallo,
hat vielleicht irgendjemand eine Ahnung, warum ich in folgender Zeile eine Assertion bekomme???
in der DLGCORE.CPP:AfxHookWindowCreate(this); hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate, //<--- HIER pParentWnd->GetSafeHwnd(), AfxDlgProc); //bwz hierWenn ich beim debuggen in die funktion "rein gehe" befinde ich mich in der AFXWIN2.INL und dort steht folgender Code:
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }Offensichtlich wir NULL returnt, aber warum?? Vor allem hat das Program genau EIN mal funktioniert... seit dem nicht mehr, auch nach neustart nicht?
Der Witz ist, das wenn ich in meiner eigenen Klasse folgende Zeile auskommentiere, läuft es. (Leider kann ich auf die Zeile nicht verzichen)
TC_ITEM tabItem; CString tabText; for( i = 0; i < m_wavelengthCount; i++ ){ tabItem.mask = TCIF_IMAGE | TCIF_TEXT; tabText.Format(_T("%8.3f"),m_wavelengths[i]); // DIESE ZEILE IST AUSZUKOMMENTIEREN tabItem.iImage = i; tabItem.pszText = tabText.GetBuffer(1); tabItem.cchTextMax = tabText.GetLength(); TabCtrl_InsertItem(m_tabControl.m_hWnd,i + 1, &tabItem); }Wäre wirklich für jede Hilfe dankbar.
Beim Zeitpunkt der Assertion steht übrigens folgendes im Stack:
CWnd::CreateDlgIndirect(const DLGTEMPLATE * 0x004509c8, CWnd * 0x00000000 {CWnd hWnd=???}, HINSTANCE__ * 0x00400000) line 327 + 15 bytes CDialog::DoModal() line 525 + 26 bytes CPowAccApp::start() line 472 + 11 bytes CPowAccApp::InitInstance() line 195 AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f1f, int 1) line 40 + 11 bytes WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f1f, int 1) line 34 WinMainCRTStartup() line 330 + 54 bytes KERNEL32! 7c816fd7()Hoffe irgendjemand hat mit diesem Fehler Erfahrung,
vielen, vielen Dank im Voraus,
Phil
-
Die Stringformatierung geht in die Hose und beschädigt möglicherweise den Stack. Enthält m_wavelengths[i] vielleicht etwas anderes als einen Double-Wert?
-
Hey,
also eigentlich kann m_wavelenths[i] nichts anderes enthalten,... zumal das Programm ja genau ein mal läuft und ab dann nicht mehr.
Das Array wird nur an folgender Stelle beschrieben:
m_wavelengthCount = i; m_wavelengths = new double[i]; m_values = new double[i]; m_results = new double[i]; m_done = new bool[i]; for( i = 0; i < m_wavelengthCount; i++ ) { app->getWavelength(i,m_wavelengths[i]); m_values[i] = 0; m_done[i] = false; } m_refValue = app->getRefValue(); m_refString.Format(IDS_REF_VALUE,m_refValue); m_wavelength = m_wavelengths[0]; m_channel.Format(IDS_CHANNEL_NUMBER,channel + 1);app->getWavelength() sieht folgendermaßen aus:
bool CPowAccApp::getWavelength(int entry,double& wavelength) { CString entryName; entryName.Format(_T("Wavelength%d"),entry + 1); wavelength = iniGetDouble( m_section.GetBuffer(0), entryName.GetBuffer(0), 0.0, m_iniFile.GetBuffer(0)); m_section.ReleaseBuffer(); m_iniFile.ReleaseBuffer(); return wavelength != 0.0; } // end of CPowAccApp::getWavelengthSieht nicht nach falscher "Beschreibung" aus, oder? Woran könnte es sonst noch liegen?

Danke für jede Hilfe,
Phil
-
phil_z schrieb:
m_wavelengthCount = i;
Bist du sicher, dass diese Zuweisung so richtig ist?
Welchen Wert hat i an dieser Stelle?
-
Eigentlich schon, i hat an dieser Stelle den wert 1.
also i = 1 .
-
Also beim Debuggen sehe ich das in der Zeile
tabText.Format(_T("%8.3f"),m_wavelengths[i]);i noch immer 1 ist und m_wavelengths[0] = -1.4568160000000e+144
Könnte das der Fehler sein?
-
Hilft es vielleicht, den Wert direkt auf ein double zu casten?
tabText.Format(_T("%8.3f"), (double) m_wavelengths[i]);
-
Hey das hat tatsächlich irgendwas verändert...
wenn ich jetzt debugge oder auch "run mach" (weißt scho) läuft es ohne die Meldung durch und gibt mir aber am Schluss dann ein
Error inserting data in Database!
The error-message is:
-1104 Your insertion was unsuccessful, but database was able to recover by itself. Database is open for further entries, but you should concact your System AdministratorAllerdings wenn ich die .exe von meiner eigentlichen Anwendung starten lasse, kommt noch immer die selbe Assertion... wie kann das?

Aber Danke schon mal für den casting tip

-
Deine eigene Anwendung startet vielleicht noch eine nicht aktualisierte EXE.
Bei der Datenbank-Fehlermeldung kann ich Dir leider nicht helfen, da hilft nur Debuggen.
-
Die .exe ist schon die gleiche, die habe ich rüber kopiert (schon 2 mal jetzt) allerdings werden der exe noch irgendwie Argumente übergeben, da es 2 verschiedene Tests gibt, die beide diese gleiche .exe benutzen. Der Witz ist, dass der Ch1 Test immer funktioniert, aber der Ch2 Test eben nicht.
Mei ich glaub der Fehler ist da noch nicht ganz gelöst. Es werden halt eine ganze Menge Daten in die DB geschrieben, da ist es nicht so leicht heraus zu finden welcher Wert Probleme macht...
Naja ich werde noch mal weiter schauen und evtl. weiter posten wenn ich Neuigkeiten habe.
Tausend Danke aber schon mal für Deine Hilfe!!!Beste Grüße,
Phil
-
Kann es sein, dass die Format-Anweisung noch an einer anderen Stelle im Code auftaucht? Du kannst übrigens der Anwendung beim Debuggen in VC auch Argumente übergeben. Damit kannst Du den zweiten Fall (Ch2 Test) auch debuggen.
-
Ich habe alle .Fomrat anweisungen mit "(double)" versehen aber das Ergebnis ist das gleiche. Ich habe festgestellt dass auch wenn ich die .exe im Debug Ornder starte (via Doppelklick) kommt die Assertion Meldung. Genau wie beim Starten aus der Anwendung. Aber Deguggen kann ich und beim klick auf "Run" läufts auch durch.... (abgesehen vom DB Fehler dann).... komisch oder?
-
Oh je....
ich habe den Fehler gefunden... habe allerdings KEINE Ahnung wie und warum der Fehler überhaupt existiert.
Folgendes:
Das Program holt sich Informationen aus ini.files und die aus der Registry. Irgendwie (warum auch immer) war der Pfad für das .ini falsch aus dem ..\ini\.. wurde ...\bin\... gemacht. Das muss aber geschehen sein nach dem das Programm einmal durch gelaufen ist... weil egal auf welchem Rechner ich es laufen lassen habe, lief es genau ein mal und dann nimmer. Jetzt hab ich den Registry Eintrag geändert und es läuft problemlos.... das ergibt überhaupt keinen Sinn.Aber egal, ich bin happy und sehr, sehr Dankbar für die Unterstüzung hier im Forum!!!! DANKE!!!

Phil