[WinAPI] Öffnen einer Datei über Menü



  • Hallo erstmal,

    ich mache gerade meine ersten Schritte in Sachen WinAPI und soll mich für die Uni gleich mal mittels einer Aufgabe ein bisschen einarbeiten. Und zwar möchte ich mittels eines Dialogs à la GetOpenFileName() eine Datei auswählen und deren Inhalt von einer selbstgeschriebenen Funktion auswerten lassen. Was das GUI-seitige angeht funktioniert soweit alles: mein Hauptfenster hat ein Menu, dort kann ich den Dialog zum öffnen einer Datei "starten" und eine Datei auswählen. Doch leider klappt alles weitere nicht mehr. Meine Funktion zum öffnen einer Datei sieht wie folgt aus:

    void ReadInDate(HWND hWnd, short** Import, char *FileName)
    {
       OPENFILENAME ofn;
       char szFileName[4096] = "";
    
       ZeroMemory(&ofn, sizeof(ofn));
    
       ofn.lStructSize = sizeof(ofn);
       ofn.hwndOwner = hWnd;
       ofn.lpstrFilter = "DICOM Datei (*.IMA)\0*.IMA\0";
       ofn.lpstrFile = szFileName;
       ofn.nMaxFile = MAX_PATH;
       ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
                   OFN_HIDEREADONLY;
       ofn.lpstrDefExt = "IMA";
    
       if(GetOpenFileName(&ofn))
          {
                Import = CtImport(hWnd,ofn.lpstrFile,SIZE);
                MessageBox(hWnd, FileName, NULL, MB_ICONINFORMATION);
                FileName = (char*) szFileName;
          }
    }
    

    Die MessageBox ist nur zum testen. Sie soll mir den Dateinamen der zu öffnenden Datei anzeigen, doch leider bleibt sie leer, so als wäre szFileName leer. CtImport ist hierbei meine selbst geschriebene Funktion, die ich aus einem älteren Projekt übernommen habe, wo sie bereits ihren Dienst geleistet hat:

    short** CtImport(HWND hWnd,char* filename, int size)
    {
        FILE* file_in;
        short i,j;
        short** _ct = NULL;
    
        if((file_in = fopen(filename, "rb")) == NULL)
        {
            //printf("Datei %s konnte nicht ge%cffnet werden\n", filename,246);
            MessageBox(hWnd, "Datei konnte nicht geöffnet werden", NULL, MB_ICONINFORMATION);
            exit(-1);
        }
    
        if((_ct = calloc(size, sizeof(*_ct))) == NULL)
        {
            //printf("Speicher konnte nicht alloziert werden\n");
            free(_ct);
            fclose(file_in);
            exit(-1);
        }
    
        for(i = 0; i < size; i++)
        {
            _ct[i] = calloc(size,sizeof(**_ct));
    
            if(_ct[i] == NULL)
            {
                //printf("Speicher konnte nicht alloziert werden\n");
    
                for(; i > 0; i--)
                {
                    free(_ct[i]);
                }
                free(_ct);
                fclose(file_in);
                exit(-1);MessageBox(hWnd, "Datei konnte nicht geöffnet werden", NULL, MB_ICONINFORMATION);
            }
        }
    
        for(i = 0; i < size; i++)
        {
            for(j = 0; j < size; j++)
            {
                _ct[i][j] = 0;
            }
        }
    
        //Vom Ende aus hinter der Header springen
        fseek(file_in,-size*size*2,SEEK_END);
    
        //Blockweise einlesen in das Feld
        for(i = 0; i < size /*&& !feof(file_in)*/; i++)
        {
            if(!feof(file_in))
            {
                fread(_ct[i], sizeof(**_ct), size, file_in);
            }
        }
    
        fclose(file_in);
        return _ct;
    }
    

    Offensichtlich wird wohl die Datei nicht eingelesen bzw. überhaupt geöffnet oder ähnliches. Ich bin mit dem Ganzen leider noch nicht so ganz vertraut und da wäre es nett, wenn sich das ganze mal jemand angucken könnte.

    Gruß



  • Berufspenner schrieb:

    Die MessageBox ist nur zum testen. Sie soll mir den Dateinamen der zu öffnenden Datei anzeigen, doch leider bleibt sie leer, so als wäre szFileName leer.

    Um szFileName geht es bei dem MessageBox-Aufruf ja auch nicht, sondern um FileName. Überprüfe doch einfach mal mit dem Debugger, ob in FileName auch wirklich was drin steht (Breakpoint setzen!). Das die MessageBox einen vorhandenen Inhalt einfach nicht darstellt, ist wohl unwahrscheinlich.



  • _matze schrieb:

    Berufspenner schrieb:

    Die MessageBox ist nur zum testen. Sie soll mir den Dateinamen der zu öffnenden Datei anzeigen, doch leider bleibt sie leer, so als wäre szFileName leer.

    Um szFileName geht es bei dem MessageBox-Aufruf ja auch nicht, sondern um FileName. Überprüfe doch einfach mal mit dem Debugger, ob in FileName auch wirklich was drin steht (Breakpoint setzen!). Das die MessageBox einen vorhandenen Inhalt einfach nicht darstellt, ist wohl unwahrscheinlich.

    Danke für deine Antwort, aber mittlerweile hat sich das Problem erledigt und es funktioniert jetzt alles so, wie es soll 🙂



  • Und was war das Problem? Das sollte man immer posten für Leute, die eventuell über die SuFu hier landen und ein ähnliches Problem haben...



  • Die endgültige Funktion sieht mittlerweile, wenn auch noch nicht ganz perfekt, so aus:

    void ReadInDate(HWND hWnd, char FileName[MAX_PATH], short** _ct)
    {
        //short** _ct = CtMemory(hWnd);
        short i = 0;
        OPENFILENAME ofn;
        char szFileName[MAX_PATH] = "";
        FILE* File = NULL;
    
        ZeroMemory(&ofn, sizeof(ofn));
    
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = hWnd;
        ofn.lpstrFilter = "DICOM Datei (*.IMA)\0*.IMA\0"
                          "Alle Dateien (*.*)\0*.*\0";
        ofn.lpstrFile = szFileName;
        ofn.nMaxFile = MAX_PATH;
        ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
                    OFN_HIDEREADONLY;
        ofn.lpstrDefExt = "IMA";
    
        if(GetOpenFileName(&ofn))
        {
            if((File = fopen(szFileName,"rb")) == NULL)
            {
                MessageBox(hWnd, "Datei wurde nicht geöffnet", NULL, MB_ICONINFORMATION);
            }
    
            sprintf(FileName,szFileName);
            //GetFileTitleA(szFileName,FileName,sizeof(FileName));
    
            //Vom Ende aus hinter der Header springen
            fseek(File, -512*1024, SEEK_END);
    
            //Blockweise einlesen in das Feld
            for(i = 0; i < 512; i++)
            {
                if(!feof(File))
                {
                    fread(_ct[i], sizeof(short), 512, File);
                }
            }
            DataIsIn = TRUE;
            fclose(File);
        }
        //return _ct;
    }
    

    Die Variable "FileName" wurde nun global deklariert, da sie offensichtlich nach jedem Aufruf meiner LRESULT CALLBACK WndProc() Funktion, in der die Messages-Auswertung stattfindet, "geleert" wurde.


Log in to reply