2012-02-02 16 views
13

¿Hay una manera simple de abrir un archivo por su programa asociado en Windows? (como hacer doble clic en el explorador de Windows pero hecho automáticamente con mi código)¿Cómo se puede abrir un archivo con el programa asociado a su extensión de archivo?

Por ejemplo, en la computadora A, "text.txt" se abrirá en wordpad pero en la computadora B se abrirá con Notepad ++ debido a la los usuarios asignan asignaciones de extensión.

me trataron ShellExecute

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

que funciona pero si omite el parámetro notepad.exe ocurren cosas extrañas (se muestra un explorador de azar).

+0

Si ya lo hizo funcionar, ¿cuál es la pregunta? –

Respuesta

19

que desea utilizar para abrir el archivo como argumento de archivo, no el argumento de parámetro. No es necesario especificar qué programa usar, ShellExecute lo buscará por usted.

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

Al dejar el verbo como NULL (0) en lugar de L"open", se obtiene la verdadera acción predeterminada para el tipo de archivo - por lo general esto es open pero no siempre.

+0

Debo estar cansado, ¡gracias que lo hizo! – Valmond

+0

Solo un ejemplo: mspaint, que no se puede iniciar con "abrir" –

2

Ver Launching Applications:

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

En las ventanas, un buen gancho de memoria es pensar en todos los archivos de datos que son ejecutables por la cáscara. También puede probarlo en un cuadro de comandos, donde puede simplemente escribir un nombre de archivo y se abrirá. O bien, al revés, se pueden abrir todos los archivos en Windows y la acción de apertura predeterminada para los archivos ejecutables es ejecutarlos.

0

Quizás pruebe empezar en lugar de abrir?

+1

'open' es el verbo predeterminado que Explorer usa cuando hace doble clic en un archivo. Puede dejar el parámetro NULL para usar el valor predeterminado real para el tipo de archivo. –

1

Si lpFile especifica un archivo de documento, la bandera simplemente se pasa a la aplicación asociada

Así que hay que sustituir "c:\\windows\\notepad.exe" con el archivo real que desea abrir y dejar lpParameters nula.

1

De acuerdo con la MS Knowledge Base, ShellExecute debería funcionar (hacemos esto en Delphi todo el tiempo):

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

un poco más posibilidades aquí:

Si desea abrir - por ejemplo - el archivo por defecto con Notepad ++ (si está instalado), puede escanear por su clave de registro si existe y dónde se encuentra, (Generalmente HKLM\SOFTWARE\Wow6432Node\Notepad++ [probado Win7]) luego toma ese camino y ábrelo.

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); 

Si desea que el usuario sea capaz de cambiar el programa predeterminado o seleccionar un programa que él/ella quiere usar, se puede abrir la opción "Abrir con" de diálogo.

//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); 

También puede abrir el archivo en el explorador.

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