2015-11-02 5 views
5

ho questo piccolo programma, che è intened per mostrare le proprietà dei file di Windows/cartella di dialogo sulla specificato info.lpFile:Aprire il file di Windows/cartella di dialogo da C

#include <windows.h> 

main() { 
    SHELLEXECUTEINFO info = {0}; 

    info.cbSize = sizeof(SHELLEXECUTEINFO); 
    info.lpFile = "C:\\test.txt"; 
    info.nShow = SW_SHOW; 
    info.fMask = 0x00000000; 
    info.lpVerb = "properties"; 

    ShellExecuteEx(&info); 
} 

Quando compilo ed eseguirlo, ottengo il seguente messaggio di errore:

Error message

sto usando Win7 e Mingw compilatore gcc. Qualcuno sa cosa c'è di sbagliato nel mio codice? Mi sto perdendo qualcosa?

+0

Si potrebbe provare 'SEE_MASK_INVOKEIDLIST' per' fMask'. – alk

+0

Ho provato, ma il programma si blocca solo con questa maschera. – polis

+0

Il tuo codice manca di inizializzare (il resto) di 'info' – alk

risposta

4

Prima di tutto il codice come mostrato non inizializza correttamente info.

Per fissare questo cambiamento

SHELLEXECUTEINFO info; 

di essere

SHELLEXECUTEINFO info = {0}; 

uso 2ndly SEE_MASK_INVOKEIDLIST per SHELLEXECUTEINFO s' membro fMask.

Per il vostro riferimento: https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784%28v=vs.85%29.aspx

prega di notare che per vedere la finestra delle proprietà aperta, il codice invocante non deve finire immediatamente. Quindi aggiungere qualcosa di simile

Sleep(10000); 

alla fine del codice di test, come mostrato.


codice completo che funziona per me:

#include <windows.h> 

int main(void) 
{ 
    SHELLEXECUTEINFO info = {0}; 

    info.cbSize = sizeof info; 
    info.lpFile = L"C:\\tmp\\tmp.txt"; 
    info.nShow = SW_SHOW; 
    info.fMask = SEE_MASK_INVOKEIDLIST; 
    info.lpVerb = L"properties"; 

    ShellExecuteEx(&info); 

    Sleep(10000); 
} 

opzioni di compilazione:

/ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Debug\SOxyzConsoleEmpty.pch" /Fa"Debug\" /Fo"Debug\" /Fd"Debug\vc100.pdb" /Gd /TC /analyze- /errorReport:queue 

(Testato con VS2010, con sistema operativo Windows 7)

+0

vuoi dire che ha funzionato per te con questa maschera? Per me, si blocca, e nient'altro. – polis

+0

Ottimo lavoro! Grazie. – polis

+0

se l'utente chiude la finestra di dialogo delle proprietà del file aperto, il programma C viene comunque eseguito a causa della durata di 'Sleep()'. Come posso terminare l'esecuzione del programma C quando la finestra di dialogo delle proprietà è chiusa? – polis

-1

Comincerei inizializzando le informazioni:

SHELLEXECUTEINFO info = {0}; 

Poi, mi piacerebbe provare un verbo che esiste realmente nel Registro di sistema HKEY_CLASSES_ROOT\txtfile\shell

info.lpVerb = "open"; 

che ho il forte sospetto funzionerà. Il problema è che explorer non avvia un'applicazione per mostrare le proprietà dei file: è integrata. Non tutte le funzionalità di un menu di scelta rapida dei file sono un verbo che è possibile richiamare tramite ShellExecute.

Se si vuole invocare la voce di menu proprietà del contesto di un file - è necessario eseguire una query per la IShellFolder che rappresenta la cartella dei file, chiamare GetUIObjectOf per ottenere il IContextMenu per il file, che è quindi possibile chiamare InvokeCommand on.

Vedere Getting Information About the Contents of a Folder su MSDN per informazioni.

+1

Il ragazzo vuole aprire le proprietà del file (dialogo) non il file stesso. – alk

+0

Prendi prima il codice per il caso easy. –

Problemi correlati