2012-02-02 13 views
13

C'è un modo semplice per aprire un file dal suo programma associato in Windows? (come doppio clic su Windows Explorer ma fatto automaticamente con il mio codice)Come si può aprire un file con il programma associato alla sua estensione?

Ad esempio, sul computer A, "text.txt" verrà aperto nel wordpad ma sul computer B verrà aperto da Notepad ++ a causa del assegnazione di estensioni di file degli utenti.

ho cercato ShellExecute

ShellExecute(0, L"open", L"c:\\windows\\notepad.exe" ,L"c:\\outfile.txt" , 0 , SW_SHOW); 

che funziona ma se omette il parametro notepad.exe accadono cose strane (un esploratore a caso viene mostrata).

+0

Se hai già funzionato, qual è la domanda? –

risposta

19

si desidera utilizzare il file da aprire come argomento file, non l'argomento del parametro. Non c'è bisogno di specificare quale programma usare, ShellExecute lo cercherà.

ShellExecute(0, 0, L"c:\\outfile.txt", 0, 0 , SW_SHOW); 

Lasciando il verbo come NULL (0) piuttosto che L"open", si ottiene la vera azione predefinita per il tipo di file - di solito questo è open ma non sempre.

+0

Devo essere stanco, grazie l'ho fatto! – Valmond

+0

Solo un esempio: mspaint, che non può essere avviato con "open" –

2

Vedi Launching Applications:

ShellExecute(NULL, "open", L"c:\\outfile.txt", NULL, NULL, SW_SHOW); 

Su finestre, un buon gancio memoria è di pensare di tutti i file di dati essendo eseguibile dalla shell. Puoi anche provarlo in una casella di comando, dove puoi semplicemente digitare un nome di file, e sarà aperto. Oppure, al contrario, è possibile aprire tutti i file di Windows e l'azione di apertura predefinita per i file eseguibili è eseguirli.

0

Forse provare start anziché aperto?

+1

'open' è il verbo predefinito utilizzato da Explorer quando si fa doppio clic su un file. È possibile lasciare il parametro NULL per utilizzare il valore predefinito effettivo per il tipo di file. –

1

Se lpFile specifica un file di documento, la bandiera è semplicemente passato all'applicazione associata

quindi è necessario sostituire "c:\\windows\\notepad.exe" con il file effettivo che si desidera aprire e lasciare lpParameters nullo.

1

Secondo il MS Knowledge Base, ShellExecute dovrebbe funzionare (facciamo questo a Delfi tutto il tempo):

ShellExecute(Handle, "Open", Filename, "", "C:\", SW_SHOWNORMAL) 
1

un po 'più possibilità qui:

Se si desidera aprire - per esempio - il file di default con Notepad ++ (se installato), si potrebbe eseguire la scansione per la sua chiave di registro se esiste e dove si trova, (Solitamente HKLM\SOFTWARE\Wow6432Node\Notepad++ [testato Win7]) quindi prendi quel percorso e aprilo.

std::wstring file = L"C:\\Outfile.txt";

if (NotepadPlusPlusExists()) //Open with Notepad++ or use an other program... (maybe your own ?) 
{ 
    std::wstring wsNPPPath = GetNotepadPlusPlusPath(); 
    ShellExecuteW(HWND, L"open", wsNPPPath.c_str(), file.c_str(), NULL, SW_NORMAL); 
} 
else //Open with default associated program <--- 
    ShellExecuteW(HWND, NULL, file.c_str(), NULL, NULL, SW_NORMAL); 

Se si desidera che l'utente sia in grado di modificare il programma predefinito o selezionare un programma di lui/lei vuole usare, si può aprire il "Apri con" finestra di dialogo.

//std::wstring StringArgsW(const wchar_t *format, ...); 
std::wstring wsCmdOpenWith = StringArgsW(L"C:\\Windows\\system32\\shell32.dll,OpenAs_RunDLL \"%s\"", file.c_str()); 
ShellExecuteW(HWND, L"open", L"C:\\Windows\\system32\\rundll32.exe", wsCmdOpenWith.c_str(), NULL, SW_NORMAL); 

È anche possibile aprire il file in Esplora risorse.

std::wstring wsCmdExplorer = StringArgsW(L"/select,\"%s\"", file.c_str()); 
ShellExecuteW(HWND, L"open", L"explorer.exe", wsCmdExplorer.c_str(), NULL, SW_NORMAL); 
Problemi correlati