XP:Programm verschwindet... GetOpenFileName ist schuld... aber warum? | Vista: alles geht



  • Hallo hallo liebe WinAPI leute...
    hier ist der allseits nervende lippoliv 😃 (versuche mich ja schon zu verbessern)

    *Vorab: Leider solltet ihr alles lesen um die Nötigen Infos zu haben und ich Programmiere das Ding während meiner Ausbildung(also in der Firma), also kann ich euch wohl keine .exe zukommen lassen, aber ich werde so gut beschreiben wies nur geht.

    Also ich habe ein Vista != XP Problem...

    [randoom stuff]

    Zu meinem Programm:
    Ich arbeite an einem Programm namens "iBT | iBassTabs" was noch irgendwie umbenannt wird. Das Programm ist -hoffentlich- hilfreich für die Musiker die S[b]a[/b]iteninstrumente spielen.
    Ich für meinen Teil bin Bassist und mich nervt es Basstabs zu schreiben, wegen der ganzen Linien-nachmal-rotze...  :) 
    
    Also bin ich dabei ein Programm zu schreiben was sowas automatisch macht.
    

    [/randoom stuff]
    Ausserdem sollen TABs in Projekte verpackt werden können. Also gibt es ein Menü mit 2 Möglichkeiten für das Laden von Daten
    +Projekt Laden
    +TAB Laden

    Beides funktioniert über eine Funktion die das Initialisieren des OpenDialoges übernimmt:

    OPENFILENAME getOpenDlg( char *openFile, int modus )
    {
    	OPENFILENAME myOpenDlg = { 0 };
    
    	myOpenDlg.lStructSize = sizeof(OPENFILENAME);
    	myOpenDlg.hwndOwner = myAppWnd; //als childwindow erzeugen
    	myOpenDlg.nFilterIndex = 1; //standardwahl
    	myOpenDlg.lpstrFile = openFile;//char* zum erhalten des Dateipfades
    	myOpenDlg.nMaxFile = 300;//max laenge des Dateipfades
    	myOpenDlg.Flags = OFN_FILEMUSTEXIST; //die Datei muss existieren
    	if( modus == IDM_OPENTAB )
    	{
    		myOpenDlg.lpstrFilter = "iBassTabs Datei\0*.iTAB\0Versuchen TXT als iTAB Laden\0*.txt\0\0";
    		myOpenDlg.lpstrTitle = "Öffnen einer TAB Datei";
    	}
    	else
    	{
    		myOpenDlg.lpstrFilter = "iBassTabs Projektdatei\0*.iPT\0Versuchen TXT als iPT zu Laden\0*.txt\0\0";
    		myOpenDlg.lpstrTitle = "Öffnen eines Projektes";
    	}
    
    	return myOpenDlg;
    }
    

    Das ist alles schön und es klappt alles...

    Wenn ich jetzt (unter XP) folgendes mache:
    Ich öffne ein Projekt (alles supi und es klappt) und dann auf "TAB öffnen" klicke... Verschwindet das Program... einfach so ... warum?
    Wenn ich "TAB öffnen" klicke geht das aber (ausgangspunkt ist, das ich vorher halt nicht Projekt öffnen gemacht habe). 😡

    case WM_COMMAND:
    	switch( LOWORD( wParam ) )
    	{
    		case IDM_OPENTAB://tab oeffnen
    			myOpenDlg = getOpenDlg( openFile, IDM_OPENTAB );
    
    			if( GetOpenFileName( &myOpenDlg ) ) //wenn der Dialog erfolgreich asugefuehrt/ausgefuellt wurde
    			{
    				openTAB( openFile );
    			}
    			else
    				printf( "2 %d\n", GetLastError() );
    		break;
    

    Das ist die Message für "TAB öffnen"... Die funktioniert, wenn ich allerdings vorher

    case WM_COMMAND:
    	switch( LOWORD( wParam ) )
    	{
    		case IDM_OPENPRJ:
    			mode = PRJMODE;
    			myOpenDlg = getOpenDlg( openFile, IDM_OPENPRJ );
    
    			if( GetOpenFileName( &myOpenDlg ) ) //wenn der Dialog erfolgreich asugefuehrt/ausgefuellt wurde
    				openPRJ( openFile );
    		break;
    

    ausführe, dann verschwindet das Programm.
    Also habe ich gesucht, es ist so das ich bei OPENTAB GetLastError ausgegeben habe:

    printf( "%d\n", GetLastError() );
    myOpenDlg = getOpenDlg( openFile, IDM_OPENTAB );
    printf( "%d\n", GetLastError() );		
    if( GetOpenFileName( &myOpenDlg ) ) //wenn der Dialog erfolgreich asugefuehrt/ausgefuellt wurde
    {printf( "%d\n", GetLastError() );
    

    Die Ausgabe war

    0
    0
    

    Und dann war das Programm weg... 2 0en sagen kein Fehler und die Zahl 2 sagt, das zwischen Ausgabe 2 und 3 ein Fehler (welcher auch immer) auftritt...
    Bei Vista klappt alles...

    Hat jemand irgendeine idee?
    Die Windows Ereignisanzeige gibt auch nichts preis...
    Ich raff es irgendwie nicht... 😮



  • Basschlüssel ?

    Ich habe seit einer Woche einen Kontrabaß, mannomann - einfach geil.
    Der Jazzbass liegt nur noch in der Ecke :-))))))))))))))))))))))))



  • Scheppertreiber schrieb:

    Basschlüssel ?

    Ich habe seit einer Woche einen Kontrabaß, mannomann - einfach geil.
    Der Jazzbass liegt nur noch in der Ecke :-))))))))))))))))))))))))

    Der währ mir zu groß xD
    Ich hab ne Jamaha RBX-375 und fand die Idee von dem Programm mal witzig...

    Endlich zwei Hobbys füreinander arbeiten lassen.
    Hast du Ahnung von solchen TABs? Bin da nicht so der Pro drinn und weiß nicht jedes Sonderzeichen und so...
    Vllt. könntest du mir im "Regelwerk" helfen (nicht beim Programmieren xD)

    BTT:Hat jemand ne Ahnung wegen meinem Problem?



  • Was willst Du genau machen ?

    Meinst Du, Noten in Tabulator-Darstellung umsetzen ?

    Ist ehrlich gesagt Unfug, Noten sollte man können. Kommt auch drauf an wie der
    Bass gestimmt ist. EADG (wie Klampfe unten) oder Quintenstimmung (einfach genial,
    so wie Mandoline etc., Du erkennst den Baß nicht wieder).

    Quintenstimmung (GDAE) ist ideal für alles was mit Folk etc (zB Heavy Metal)
    zu tun hat.

    Mit Noten-Lesen-Können ist das alles wesentlich einfacher.



  • G|---------------------------
    D|---------------------------
    A|--4-6-7--6-5---7-8-9--7-6-4
    E|4------------7-------------
    H|---------------------------
    

    Weißt du ungefähr was es is?

    Sowas soll mein Programm automatisch vervollständigen...

    also aus

    G|
    D|
    A|
    E|
    H|
    

    wird

    G|-
    D|-
    A|-
    E|4
    H|-
    

    sobald die 4 die KEYUP Msg erzeugt.. Das klappt auch alles...

    Nur XP versagt bei dem GetOpenFileName...



  • Hm, naja kurz und knapp: Deine Funktion 'getOpenDlg' ist ja auch falsch: Du definierst innerhalb der Funktion eine Variable des Typs OPENFILENAME. Diese ist lokal. Den Elementen weißt Du dann lokale C-Strings zu. Beim Kopieren der Struktur (return-Wert auf 'myOpenDlg') werden aber nur Zeiger kopiert, und zwar auf Bereiche, die es net mehr gibt (, da ja nur der Default-Assignment-Operator aufgerufen wird). Des Weiteren: wie ist 'openFile' (char*) definiert bzw. initialisiert? Hast Du das beachtet:

    MSDN schrieb:

    lpstrFile
    Pointer to a buffer that contains a file name used to initialize the File Name edit control. The first character of this buffer must be NULL if initialization is not necessary.

    ?
    Sieht nämlich nicht so aus. Und bei der verwurschtelten Funktion, wundert mich der Post auch net mehr: http://www.c-plusplus.net/forum/viewtopic-var-t-is-217979.html 😃 .



  • CodeFinder schrieb:

    Du definierst innerhalb der Funktion eine Variable des Typs OPENFILENAME. Diese ist lokal. Den Elementen weißt Du dann lokale C-Strings zu.

    Nein... Ich übergebe die Pointer auf die "C-Strings" an die Funktion, das heißt, wenn ich dann die OPENFILENAME Variable in die Originalfunktion kopiere, sollte alles richtig sein.. Und bei dem ersten Verwenden klappt ja alles, nur halt wenn ich Projekt öffne und sofort darauf nen TAB... dann schwupps die wupps.. alles weg 😞

    CodeFinder schrieb:

    Beim Kopieren der Struktur (return-Wert auf 'myOpenDlg') werden aber nur Zeiger kopiert, und zwar auf Bereiche, die es net mehr gib

    Naja da ich schon nen Pointer übergebe, wird er beim verlassen der aufgerufenen Funktion ja nich gelöscht... Zumindest sollte das nicht gemacht werden...

    Wie kommst du darauf, dass ich in der Funktion C-Strings anlege...?

    char openFile[300] = { 0 };//steht in der funktion die dann getOpenDlg aufruft
    


  • Vermutlich zerschießt du dir irgendwo beim "Projekt öffnen" den Speicher. Bei deinem etwas strubbeligen Programmierstil würde mich das nicht wundern.

    Benutz doch einfach mal den Debugger.



  • MFK schrieb:

    Vermutlich zerschießt du dir irgendwo beim "Projekt öffnen" den Speicher. Bei deinem etwas strubbeligen Programmierstil würde mich das nicht wundern.

    Benutz doch einfach mal den Debugger.

    Hihi... Ihr kritisiert alle, aber gebt keine Tipps.. das ist toll..

    if( user == lippoliv )
      hasDebugger = FALSE;
    

    ^^Ändert sich diesen oder nächsten Monat.

    [nurlesen]Also: Ich zerschieße glaub ich nichts, weil ich ja ohne Probleme 2mal Projekt öffnen ausführen kann... [/nurlesen]
    ^^der abschnitt ist egal, aber er hat mich zum Testen gebracht, und naja 2mal TAB öffnen ging, 2mal PRJ öffnen nicht...

    Jetzt habe ich die Unterschiede bis ins kleinste durchgegangen und der unterschied war, das ich bei PRJ der beiden den Titel des Progs anders veränder als bei dem TAB... diese Zeilen sind auskommentiert, und schon läuft die kiste...

    Danke werde wohl erstmal den Fehler suchen xD...



  • lippoliv schrieb:

    Hihi... Ihr kritisiert alle, aber gebt keine Tipps.. das ist toll..

    MFK schrieb:

    Benutz doch einfach mal den Debugger.

    Na, wenn das mal kein sinnvoller Tip ist, den du dir echt mal überlegen solltest, weiß ich es auch nicht...



  • Ja sicher das ist ein Tipp, aber mir stehen da keine Mittel zur verfügung...

    Ich kann leider nicht selbst bestimmen was ich nutze... Is ja hier nich mein PC xD

    Aber ich werds mir zu Herzen nehmen und mal einen suchen, der aus C Code was macht xD



  • Ok ich habe mal rumgelesen, wegen "flakern" des Forms, unter anderem Beobachte ich bei mir GDI-Objekt schwankunen (im TaskManager)

    Das ist alles nicht schlimm, es kommen 2 dazu gehen 2 weg, jeh nach aktion. ABER.

    Öffne ich diesen OpenFileName kommen 200 dazu..

    😕 Schließe ich ihn GEHEN NUR 140 WEG??? 😕

    Dann steigt mein Prog von 18 -> 221(oder so) und beim Schließen fällt es auf 75... ja wo kommen die 57 unbekannten her?(Zwischendrinn wird nur da gezeichnet, wo auch vorher gezeichnet wird, wo also die GDIs verschwinden)...

    Hat wer ne ahnung? Welchen Codeabschnitt wollt ihr sehen?



  • wenn dir kein Debugger zur verfügung steht, warum ladest
    du dir dann nicht einfach einen herunter?



  • Melan schrieb:

    wenn dir kein Debugger zur verfügung steht, warum ladest
    du dir dann nicht einfach einen herunter?

    Das währ ne super tolle sache... welchen? Wo gibt es einen Stand-Alone C Debugger?

    Währ echt 👍 wenn du einen wüsstest, ich habe noch keinen gefunden, und es gab einsame Stunden wo ich sehr danach gesucht habe 😉



  • WinDbg



  • sri schrieb:

    WinDbg

    Den kenn ich, hab ich auch, komm aber ur nich drauf fit... Muss wohl noch weiter nach "How-to-use WinDbg" suchen xD


Anmelden zum Antworten