Programm startet nicht mehr auf Windows 2003


  • Mod

    Wenn InitInstance false zurückgibt, wird Dein Programm beendet.
    Wie wäre es mal mit debuggen?

    CWinApp::Run hat auch eine Implementierung und nicht nur eine Deklaration! Und Du hast sogar den Sourcecode der MFC wo Du nachlesen kannst, was das tut.

    Deine Infos sind einfach nicht ausreichend. Was ist das für ein Programm? SDI/MDI/Dialog?

    Nur mal so am Rande:
    Wenn das Mainwindow im InitInstance erzeugt UND geschlossen wird, und WM_QUIT bereits ausgeliefert wurde, dann kann man kein weiteres Fenster mehr erzeugen... Also auch nicht DoModal für irgendeinen Dialog ausführen, oder eine MessageBox.



  • Es ist eine dialogbasierte Anwendung. InitInstance gibt mir true zurück.

    ~Mal am Rande: Dumme Frage sicherlich, aber wie kann ich auf einem PC
    debuggen, auf dem das Visual Studio nicht drauf ist?
    ~

    Leider kann ich als normaler User nicht an die Einstellungen für die Daten-
    ausführungsverhinderung ran. Admin ist erst morgen wieder da. Kann man dazu
    irgendwas aus der Registry ableiten? Dort habe ich zumindest lesend Zugriff...


  • Mod

    Dialogbasierend und InitInsitace gibt TRUE zurück. Das ist Unfug, sofern DoModal in InitInstance aufgerufen wird. Ist das so?

    Remote Debugging für welche Version?
    VC 6: http://www.mpdvc.de/artikel/RemoteDebugging.htm
    VS-200x: http://msdn.microsoft.com/en-us/library/y7f5zaaa.aspx



  • Visual Stduio 2008. Vielleicht hilft der Code der InitInstance mir zu helfen?
    Datenausführungsverhinderung kann ich ausschließen, da es mit selbiger auf
    einem anderen Win2003-Rechner dennoch funktioniert.

    Ich schaue mir jetzt das Remotedebugging an. Danke Martin.

    BOOL CtestfallApp::InitInstance()
    {
    	InitCommonControlsEx();
    
    	CWinAppEx::InitInstance();
    
    	AfxEnableControlContainer();
    
    	SetRegistryKey(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"));
    
    	CtestfallDlg dlg;
    	m_pMainWnd = &dlg;
    
    //=====================================================================
    //hier steigt das Programm aus und beendet sich  
    //kein eintrag im ereignislog von windows
    //die messagebox kommt noch, danach ist schluß.
    MessageBox(0,"Test",0,0);
    
    	INT_PTR nResponse = dlg.DoModal();
    	if (nResponse == IDOK)
    	{
    		// TODO: Fügen Sie hier Code ein, um das Schließen des
    		//  Dialogfelds über "OK" zu steuern
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		// TODO: Fügen Sie hier Code ein, um das Schließen des
    		//  Dialogfelds über "Abbrechen" zu steuern
    	}
    
    	// Da das Dialogfeld geschlossen wurde, FALSE zurückliefern, sodass wir die
    	//  Anwendung verlassen, anstatt das Nachrichtensystem der Anwendung zu starten.
    	return FALSE;
    }
    

  • Mod

    Schon mal versucht, nach DoModal ein GetLastError einzubauen und zu prüfen was passiert?



  • Das Programm gibt bei GetLastError zurück, dass der Vorgang
    erfolgreich beendet wurde.
    Nachdem ich GetLastError eingebunden habe erscheinen plötzlich auch
    die nachfolgenden Messageboxen, die sonst nie angezeigt wurden.

    INT_PTR nResponse = dlg.DoModal();
    

    nResponse liefert was anderes zurück als IDOK oder IDCANCEL und zwar "-1".
    Danach beendet das Programm.

    Ich muss dazu sagen, dass ich gelgentlich folgende Compilermeldung erhalte.....:

    Fehler 1 Fehler "31" wurde von "C:\Programme\Microsoft SDKs\Windows\v6.0A\bin\mt.exe" zurückgegeben. Projekt Testfall



  • Kurzer Nachtrag:

    An int value that specifies the value of the nResult parameter that was passed to the CDialog::EndDialog member function, which is used to close the dialog box. The return value is –1 if the function could not create the dialog box, or IDABORT if some other error occurred, in which case the Output window will contain error information from GetLastError.

    GetLastError kann ich ja danach gar net mehr aufrufen, da dass Programm beendet wird. Oder wie ist das gemeint? Wie soll ich für

    CtestfallDlg dlg;
    m_pMainWnd = &dlg;
    

    GetLastError abfragen, wenn das Programm danach sofort geschlossen wird? 😕



  • Möglicherweise ein Fehler beim Einbinden des Manifests?


  • Mod

    Hast Du evtl. ein RTF Control drauf oder ein ActiveX Control das nicht registriert ist.

    Und sicher kannst Du GetLastErrornoch aufrufen. Das Programmstürzt doh nicht ab. Es beendet doch kontrolliert.



  • Hallo Martin,

    ich mache es sicher falsch mit GetLastError:

    CtestfallDlg dlg; 
    m_pMainWnd = &dlg;
    
    INT_PTR nResponse = dlg.DoModal();
    
    	LPVOID lpMsgBuf;
    
    	if (!FormatMessage( 
    		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    		FORMAT_MESSAGE_FROM_SYSTEM | 
    		FORMAT_MESSAGE_IGNORE_INSERTS,
    		NULL,
    		GetLastError(),
    		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    		(LPTSTR) &lpMsgBuf,
    		0,
    		NULL ))
    	{
    	}
    	MessageBox( 0,(LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
    	LocalFree( lpMsgBuf );
    
    	if (nResponse == IDOK)
    	{
    		MessageBox(0,"OK!",0,0);
    
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		MessageBox(0,"CANCEL!",0,0);
    
    	}else
    	{
    		CString g;
    		g.Format("%i",nResponse);
    		MessageBox(0,g,0,0);
    	//rückgabewert ist "-1"
    	}
    

  • Mod

    Du hast ein Problem!
    Die Messageboxen werden nicht mehr angezeigt, wenn WM_QUIT gepostet wurde.

    Kommentiere mal die Zeile:

    m_pMainWnd = &dlg;
    

    in Deinem InitInstance testweise aus.



  • Ich habe es testweise dann mal auskommentiert. Am Laufverhalten ändert sich jedoch nichts.

    Unser Admin schaut sich momentan mit dem Prozessmonitor von sysinternals das
    genauer an. Was ich soweit gesehen habe ist, dass NAME NOT FOUND öfter auftaucht
    für:

    TestfallDEU.dll oder auch TestfallLOC.dll bzw. Testfall.exe.2.manifest

    Und noch einige weitere Dateien, die ich nichtmal kenne 😕

    Habe eben dann eine manifest-Datei neben die EXE kopiert. Auch keine Änderung.
    Die Testfall.exe selbst hat ein manifest eingebettet bekommen:

    In "RT_MANIFEST" unter Nr "1" steht folgendes:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="Testfall"
    type="win32"
    />
    <description>Beschreibung</description>
    <dependency>
    <dependentAssembly>
    <assemblyIdentity
    type="win32"
    name="Microsoft.Windows.Common-Controls"
    version="6.0.0.0"
    processorArchitecture="X86"
    publicKeyToken="6595b64144ccf1df"
    language="*"
    />
    </dependentAssembly>
    </dependency>
    </assembly>


  • Mod

    Das hat damit gar nichts zu tun.

    Könntet Ihr nicht etwas strukturierter vorgehen?
    Euer Problem ist doch warum der Diaog nicht angezeigt wird?
    Also wäre der nächste Schritt zu prüfen ob überhaupt WM_INITDIALOG versendet wird...

    Was wird denn nun von GetLastError ausgegeben, wenn DoModal mit -1 beendet wird?
    Du hast zwar Code eingabut der etwas anzeigt, aber nicht geschrieben was passiert!



  • Aktueller Stand ist:

    Bis OnInitDialog komme ich gar nicht (das entspricht doch WM_INITDIALOG oder?). Das Programm wirft schon nicht mal mehr
    die MessageBox nach:

    //in InitInstance()
    INT_PTR nResponse = dlg.DoModal();
    MessageBox("nach dlg.DoModal()");
    

    Auch mein GetLastError wird an der Stelle wo jetzt die MessageBox
    zu sehen ist nicht mehr verarbeitet.


Anmelden zum Antworten