Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C++WIN32] Menù apri

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++WIN32] Menù apri

    Ciao ragazzi, ho trovato e aggiustato questo codice per eseguire il WM_COMMAN del menù "Apri"

    Il mio problema è che non capisco come ricavare la path del file aperto.....al massimo sono riuscito a capire come trovare il nome del file e della cartella dove è posizionato.....aiuto.....

    codice:
    HRESULT CommandApri(HWND hwnd)
    {
        IFileDialog *pfd;
        
        // CoCreate the dialog object.
        HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, 
                                      NULL, 
                                      CLSCTX_INPROC_SERVER, 
                                      IID_PPV_ARGS(&pfd));
        
        if (SUCCEEDED(hr))
        {
            // Show the dialog
            hr = pfd->Show(hwnd);
            
            if (SUCCEEDED(hr))
            {
                // Obtain the result of the user's interaction with the dialog.
                IShellItem *psiResult;
    			IShellItem * psiBoh;
                hr = pfd->GetResult(&psiResult);
                
                if (SUCCEEDED(hr))
                {
                    // Do something with the result.
    				TCHAR * szPath; //Nome file
    				TCHAR * szPathParent; //Nome directory
    				psiResult->GetDisplayName((SIGDN)NULL,&szPath);
    
    				psiResult->GetParent(&psiBoh);
    				psiBoh->GetDisplayName((SIGDN)NULL,&szPathPar);
    
    				MessageBox(0,szPath,_T("Name of the file"),MB_USERICON);
    				MessageBox(0,szPathPar,_T("Parent Directory of the file"),MB_USERICON);
                    psiResult->Release();
                }
            }
            pfd->Release();
        }
        return hr;
    }

    chiedo ausilio

  2. #2
    Be', dovresti ottenerlo in szPath dopo aver richiamato la GetDisplayName. Comunque c'è un modo più semplice (=senza usare direttamente COM) per fare quel mestiere.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    grazie

    Grazie, adesso do un occhio al "modo più semplice", comunque sono io che ho chiamato la stringa szPath..... in realtà mostra solo il nome file.......non so come tirarla fuori la path....
    e un altra cosa, quando io apro per esempio la cartella immagini, e poi chiudo il programma, come mai quando rieseguo il programma è già sulla cartella immagini? Da quello che ho capito è per questo: CLSID_FileOpenDialog un'istanza globale per la path.....mah?

  4. #4

    Re: grazie

    Originariamente inviato da kirakira93
    Grazie, adesso do un occhio al "modo più semplice", comunque sono io che ho chiamato la stringa szPath..... in realtà mostra solo il nome file.......non so come tirarla fuori la path....
    Concatenando i due pezzi estratti nel codice di esempio; puoi usare PathAppend.
    e un altra cosa, quando io apro per esempio la cartella immagini, e poi chiudo il programma, come mai quando rieseguo il programma è già sulla cartella immagini? Da quello che ho capito è per questo: CLSID_FileOpenDialog un'istanza globale per la path.....mah?
    Non credo che c'entri quello, probabilmente è una delle feature fornite "d'ufficio" dai common dialog.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    un'altra cosa

    ok ho provato a usare il secondo metodo, non mi funzionava ma poi ho visto che serviva la dimensione della struttura, ecco qui

    codice:
    #include <windows.h>
    #include <string>
    
    using namespace std;
    
    OPENFILENAME ofn; 
    HANDLE hFile; // << Forse questo mi potrà servire
    
    string CommandOpen()
    {
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lpstrFilter = "All files *.*\0";
    ofn.lpstrInitialDir = "C:\\";
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    ofn.lStructSize = sizeof(ofn);
    
    
    if(!GetOpenFileName(&ofn))return "Err";
    MessageBox(NULL,"Dove trovo la path?","Path",0);
    MessageBox(NULL,"Come mai anche se imposto la path C:\\\
    ,\nmi apre l'ultima cartella da cui ho aperto il file?","Path",0);
    return "path....:D magari ci fosse :D";
    }
    
    int main()
    {
    string sReturnOpen = CommandOpen();
    if(sReturnOpen != "Err")
    MessageBox(NULL,sReturnOpen.c_str(),"Path",0);
    return 0;
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    mmm forse ho capito

    Forse ho capito che la soluzione sarebbe di ricavare sempre il nome della dyrectory precedente al file finchè non si giunge ad una partizione ("C:\","D:\",etc), il problema è che nel secondo metodo per ricavare il file (GetOpenFileName() ) non esiste un campo della struttura che ricava la directory del file precedente o del nome file ( o meglio io non ho capito dov'è.....)

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    ok adesso ho capito

    Bene sono riuscito a capire
    ofn.lpstrFile è un puntatore a str....come ho fatto a non accorgemene.....
    basta assegnargli qualcosa tipo ofn.lpstrFile = szNomeFile e sei apposto

    Grazie comunque di tutto mItaly

  8. #8

    Re: ok adesso ho capito

    Originariamente inviato da kirakira93
    Grazie comunque di tutto mItaly
    Non c'è di che, lieto che tu abbia risolto.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.