DoModal und Access Violation
-
Hi,
habe folgenden Fehler... Hoffe ihr könnt mir helfen..
Der Dialog wird kurz angezeigt, dann kommt die Windows Meldung: Access Violation at Adress.... in Module Blabla.dll. Read of Adress 000000000.
#include "MyOwnDialog.h"
...
...
CMyOwnDialog mydlg;
mydlg.DoModal();
...
...(mit Visual C++ 6.0 und Windows NT4)
Danke,
Mäxxx
-
Du hast irgendwo einen NULL Zeiger.
Machst du GetDlgItem oder so?
Zeig mal OnInitDialog.
Hast du schon mal schrittweise debugged, dann merkst du, wo er die Grätsche macht.
-
hi, schön, das du mir helfen willst

was ist InInitDialog?
Debuggen geht leider nicht richtig, aber ich zeig dir mal die Stellen, wo da NULL vorkommt:
MyOwnDialog.h:
--------------// Dialogfeld CMyOwnDialog class CMyOwnDialog : public CDialog { // Konstruktion public: CMyOwnDialog(CWnd* pParent = NULL); // StandardkonstruktorWenn ich dieses NULL auskommentiere kommt 'CMyOwnDialog' : Kein geeigneter Standardkonstruktor verfuegbar.
MyOwnDialog.cpp
---------------CMyOwnDialog::CMyOwnDialog(CWnd* pParent /*=NULL*/) : CDialog(CMyOwnDialog::IDD, pParent) { //{{AFX_DATA_INIT(CMyOwnDialog) m_test = _T(""); m_test2 = _T(""); //}}AFX_DATA_INIT }Und das NULL ist eh auskommentiert.
Danke

-
Hi
estardu meint Zeiger, die du selbst erstellt hast. OnInitDialog wird übrigens ausgeführt, wenn dein Programm startet und dort kannst du halt Sachen initialisieren oder so. Wenn der Dialog kurz erscheint, hast du vielleicht einen Timer gestartet?
-
hi,
ne, kein timer, das dialogfeld bleibt ja da.
Kann es vielleicht sein, dass das Anzeichen der von Entwicklern gefürchteten "DLL-Hell" ist und einige DLL nicht zueinander passen / inkomptibel sind?
-
Nu mal dir nicht gleich solche Horrorgeschichten aus.
Warum geht debuggen nicht?
Hast du die Funktion OnInitDialog in deinem Dialog gefunden?
Welche Dll wird angemeckert?
-
Debuggen geht nicht, weil ich hier im Praktikum sitze, und ich nur die eine kleine Funktion in eine DLL einbauen soll. Da ist mir das viel zu kompliziert. *g* Da merkt man mal wieder, dass das Studium im Grunde wirklich kaum was wert ist, und man die wichtigen Sachen nur in der Praxis lernt!

OnInitDialog gibts hier nirgends..
Fehlermeldungen:
LINK : warning LNK4089: Alle Verweise auf "ADVAPI32.dll" wurden durch /OPT:REF verworfen
LINK : warning LNK4089: Alle Verweise auf "SHELL32.dll" wurden durch /OPT:REF verworfen
LINK : warning LNK4089: Alle Verweise auf "comdlg32.dll" wurden durch /OPT:REF verworfen
-
Die MSDN sag das hier zu der Meldung:
[msdn]Linker Tools Warning LNK4089
all references to "dynamic-link library" discarded by /OPT:REFThe linker discarded all packaged functions that referenced exports in dynamic-link library. As a result, dynamic-link library and its import library are unneeded.
[/msdn]/OPT:REF ist eine Einstellung in den Projekteigenschaften, aber frag blos nicht welche.

Passiert der Absturz erst, seit deine Funktion dabei ist oder auch vorher schon?
Wie hängt die Funktion mit dem Dialog zusammen? Wird sie von ihm aufgerufen?Starte das Programm bitte mal mit F5 im Debugmodus, manchmal springt er auch bei schweren Fehlern noch zu der Stelle, wo der Fehler passiert ist. Die könnte auch hilfreich sein.
Achja: Debuggen musst du früher oder später eh lernen - oder willst du Theoretiker werden? :p
PS: comdlg32.dll ist die Dll, wo einige/viele/wichtige Dialogelemente drin sind.
Und shell klingt nicht weniger wichtig.
-
Wenn du die OnInit nicht findest, hast du dann ein SDI/MDI-Projekt?
-
hi,
debuggen haben mir jetzt die Genies aus der Programmierung gezeigt!

Hier macht er die Fehlermeldung:
VERIFY(RunModalLoop(dwFlags) == m_nModalResult);(in der dlgcore.cpp)
ich hatte tatsächlich kein OnInitDialog gehabt.
Aber nun schon!
MyOwnDialog.cpp:
BOOL CMyOwnDialog::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Zusätzliche Initialisierung hier einfügen return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben }MyOwnDialog.h:
... virtual BOOL OnInitDialog(); ...laufen tuts leider noch ned....

-
Ergänzung:
Der Absturz passier nur, wenn
intrc = mydlg.DoModal();dabei ist, sonst nicht.
Die Funktion ruft den Dialog auf. Der ist aber noch ziemlich leer.
Und an den DLLs liegt es nicht, hab ich mir sagen lassen...