FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Como hacer para abrir un archivo con mi app dandole dclick en el shell
por ejemplo al dar dobleclick en un fichero de texto inmediatamente lo habre
el blob de notas como puedo hacer para que por ejemplo lo abriera mi aplicacion gracias de antemano |
#2
|
||||
|
||||
Suponiendo que utilizas windows:
Si es una extensión que no existe: Le dás doble click y te preguntará con qué aplicación quieres abrirlo. Sigue los pasos y ya está. Si es una extensión que ya se abre con un programa: - Abre "Mi PC" - Herramientas --> Opciones de Carpeta - Solapa Tipos de Archivo - Elige el tipo de archivo. - Pica sobre el botón "Cambiar" - Selecciona el programa con el que quieres abrir. |
#3
|
|||
|
|||
Hola,
puedes usar la funcion ShellExecute (en ShellAPI), que en teoria usando la opcion 'open' llamara al explorador de windows y lo abrira. Tambien puedes implementarlo tu, aunque es laborioso (buscar en el registro extension y programa asociado, etc...). Hay bastante informacion en el foro sobre ShellExecute, te recomiendo su busqueda. Tambien puedes usar la funcion WinExec saludos |
#4
|
||||
|
||||
Si quieres registrar un tipo de archivo para abrir con una determinada aplicación, tienes que abrir el registro de Windows y crear en HKEY_CLASSES_ROOT la clave correspondiente a ese archivo (.ext) y luego escribir otra clave con el tipo de archivo para definir el programa que la abre y su icono.
Abre el registro y cotillea los tipos de archivo y cómo se definen. Bueno, aquí tienes el código: Código:
#include <Registry.hpp> #include <shlobj.h> void RegisterFileType(AnsiString Ext, AnsiString PathExec) { // Ext tipo de archivo : EXTENSION // PathExec: RUTA COMPLETA del ejecutable que queremos que lo abra TRegistry *Registry = new TRegistry; try{ Registry->RootKey = HKEY_CLASSES_ROOT; // Crear la clave .Ext Registry->OpenKey("." + Ext, true); try{ // Ccrear el valor con el nombre del tipo de archivo para esta clave (extfile) Registry->WriteString("", Ext + "file"); } __finally{ Registry->CloseKey(); } // Crear una clave nueva para el nombre del tipo de archivo dado anteriormente (extfile) Registry->CreateKey(Ext + "file"); // Crear una nueva clave para el icono por defecto Registry->OpenKey(Ext + "file\\DefaultIcon", true); // Crear un valor con el icono (PathExec.exe,0) try{ Registry->WriteString("", PathExec + ",0"); } __finally{ Registry->CloseKey(); } Registry->OpenKey(Ext + "file\\shell\\open\\command", true); //Crear el valor para el ejecutable que abre el tipo de archivo (PathExec.exe "%1") try{ Registry->WriteString("", PathExec + " \"%1\""); } __finally{ Registry->CloseKey(); } } __finally{ delete Registry; } // Notificar al sistema el cambio efectuado SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); } Saludos. Última edición por escafandra fecha: 02-07-2008 a las 20:22:42. |
#5
|
|||
|
|||
gracias pero ya todo eso lo se
yo lo que quiero es que mi programa capture el evento para abrir el archivo por ejemplo yo registro la clase perfecto le doy doble y abre mi programa (supongamos un editor de texto) pero se abriria vacio sin cargar el fichero entienden entonces lo que quiero es como saber que fichero genero el evento de abrir para cargarlo... no se si tenga que ver con el paramstr(no lo creo) o capturar un mensaje de windows que me diga que fichero abrir(o sea el que genero la accion de abrir) disculpen la molestia |
#6
|
|||
|
|||
paramstr(0) es el nombre del .exe en el momento de registrar la extension a windows, escoges tu programa, siempre que no lo hagas mediante codigo. saludos. |
#7
|
|||
|
|||
ok gracias parece que debi probar con el paramstr desde el principio pero no pense que fuera tan facil
|
#8
|
|||
|
|||
jej personalmente encuentro mas divertido primero probar y luego preguntar (aunque a veces te la pegas ) saludos y de nada
|
#9
|
||||
|
||||
Bueno, apuntar una aclaración. Lo que tu quieres hacer requiere haber registrado previamente, de alguna forma, el tipo de archivo. luego, usar los parémetros de la línea de comandos, como apunta coso,
En Builder C++ sería algo así: Código:
// Siendo LoadFile la función que abre el fichero if(ParamCount()>0){ LoadFile(ParamStr(1)); // Abre la cadena del primer parámetro pasado } Usa una variable static de la función que al cambiar de valor te indica que ya no es la primera ejecución. En algun caso puedes tener conflictos con ventanas que no se han creado y cuyo código no puede ejecutarse hasta que se existan visualmente. En este caso un truco es usar un TTimmer que se desactiva sólo (sólo ocurrirá una vez). Mira este código. Cada vez que clickes en Form1 se ejecutará el evento OnActivate otra vez... Es un ejemplo que demuestra que no es un evento seguro a no ser que firtremos la primera vez que se ejecuta. Código:
void __fastcall TForm1::FormActivate(TObject *Sender) { static int n=0; Label1->Caption = IntToStr(n); n++; Form2->Show(); } Código:
void __fastcall TForm1::TimerCreateTimer(TObject *Sender) { TimerCreate->Enabled = false; AfterCreate(); // Función que seguro se ejectua tras crear visualmente la ventana } |
#10
|
|||
|
|||
Intente agregar a un nuevo proyecto el codigo de c publicado
Código:
#include <Registry.hpp> #include <shlobj.h> void RegisterFileType(AnsiString Ext, AnsiString PathExec) { // Ext tipo de archivo : EXTENSION // PathExec: RUTA COMPLETA del ejecutable que queremos que lo abra TRegistry *Registry = new TRegistry; try{ Registry->RootKey = HKEY_CLASSES_ROOT; // Crear la clave .Ext Registry->OpenKey("." + Ext, true); try{ // Ccrear el valor con el nombre del tipo de archivo para esta clave (extfile) Registry->WriteString("", Ext + "file"); } __finally{ Registry->CloseKey(); } // Crear una clave nueva para el nombre del tipo de archivo dado anteriormente (extfile) Registry->CreateKey(Ext + "file"); // Crear una nueva clave para el icono por defecto Registry->OpenKey(Ext + "file\\DefaultIcon", true); // Crear un valor con el icono (PathExec.exe,0) try{ Registry->WriteString("", PathExec + ",0"); } __finally{ Registry->CloseKey(); } Registry->OpenKey(Ext + "file\\shell\\open\\command", true); //Crear el valor para el ejecutable que abre el tipo de archivo (PathExec.exe "%1") try{ Registry->WriteString("", PathExec + " \"%1\""); } __finally{ Registry->CloseKey(); } } __finally{ delete Registry; } // Notificar al sistema el cambio efectuado SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); } Código:
[C++ Error] shlobj.h(1762): E2238 Multiple declaration for 'FVSHOWINFO' [C++ Error] shlobj.h(1936): E2238 Multiple declaration for 'FOLDERSETTINGS' [C++ Error] shlobj.h(3717): E2238 Multiple declaration for 'DESKBANDINFO' [C++ Error] shlobj.h(4808): E2238 Multiple declaration for 'SHELLFLAGSTATE' Código:
shlobj.h // -------------------------------------------------------------------- typedef struct { // Stuff passed into viewer (in) DWORD cbSize; // Size of structure for future expansion... HWND hwndOwner; // who is the owner window. int iShow; // The show command // Passed in and updated (in/Out) DWORD dwFlags; // flags RECT rect; // Where to create the window may have defaults IUnknown *punkRel; // Relese this interface when window is visible // Stuff that might be returned from viewer (out) OLECHAR strNewFile[MAX_PATH]; // New File to view. } FVSHOWINFO, *LPFVSHOWINFO; // -------------------------------------------------------------------- typedef struct { UINT ViewMode; // View mode (FOLDERVIEWMODE values) UINT fFlags; // View options (FOLDERFLAGS bits) } FOLDERSETTINGS, *LPFOLDERSETTINGS; // -------------------------------------------------------------------- typedef struct { DWORD dwMask; POINTL ptMinSize; POINTL ptMaxSize; POINTL ptIntegral; POINTL ptActual; WCHAR wszTitle[256]; DWORD dwModeFlags; COLORREF crBkgnd; } DESKBANDINFO; // -------------------------------------------------------------------- typedef struct { BOOL fShowAllObjects : 1; BOOL fShowExtensions : 1; BOOL fNoConfirmRecycle : 1; BOOL fShowSysFiles : 1; BOOL fShowCompColor : 1; BOOL fDoubleClickInWebView : 1; BOOL fDesktopHTML : 1; BOOL fWin95Classic : 1; BOOL fDontPrettyPath : 1; BOOL fShowAttribCol : 1; BOOL fMapNetDrvBtn : 1; BOOL fShowInfoTip : 1; BOOL fHideIcons : 1; UINT fRestFlags : 3; } SHELLFLAGSTATE, * LPSHELLFLAGSTATE; PD: utilizo Borland C++ Builder 5 |
#11
|
||||
|
||||
Para compilarlo con BCB5 tendrás que añadir lo siguiente al principio de tu archivo cpp:
Código:
#define ShlObjHPP #include <vcl.h> #pragma hdrstop #include <shlobj.h> #include <Registry.hpp> Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Problemas para abrir archivo EXCEL | marceloalegre | Varios | 1 | 18-09-2007 19:40:39 |
como puedo hacer para cambiar un archivo de excel con versión 2.1 a versión 8.0 | RONPABLO | Servers | 4 | 23-01-2006 06:02:38 |
abrir un html con ie dandole el path completo !! | Velia | Varios | 3 | 12-11-2005 23:04:45 |
Como abrir un archivo .EXE? | Albano | Varios | 4 | 29-05-2005 14:37:43 |
¿Qué instrucción es necesaria para abrir un archivo PDF? | vhirginia | Varios | 10 | 07-05-2004 00:05:36 |
|