[C con Clase] Ayuda Obtener El Path De La Aplicación (GetAppPath Y CString?)

Ferran Ferri ferranferri en gmail.com
Vie Mar 16 15:48:00 CET 2007


Hola,

aprovechando el tema, tengo una pregunta. Existen alternativas a MAX_PATH
para saber la longitud maxima de un archivo pero en ANSI C o ANSI C++?

Gracias



On 3/15/07, D1e6o! <diegogeid en gmail.com> wrote:
>
> Hola! Si, obviamente que me sirvió y mucho...! Muchas Gracias como siempre
> te digo capo...! Tanto por esta ayuda como las demás que son enormes!
> Que más podría preguntar? Me sacaste tdas las dudas al respecto. Un saludo
> enorme...! Y con lo de GetFileModuleName ya está clarísimo todo. Muchísimas
> gracias de nuevo!!!
>
> El día 15/03/07, Steven Davidson <steven en conclase.net> escribió:
> >
> > Hola Diego,
> >
> > El pasado 2007-03-15 04:01:17, D1e6o! escribió:
> >
> > D> Hola gente, acá estoy con un problema:
> > D> Estoy intentando conocer el path de la aplicación, pero no lo logro.
> > Por lo
> > D> que tengo entendido debo usar la siguiente función:
> > D> CString GetAppPath ()
> > D> {
> > D> TCHAR app_path[_MAX_PATH];
> > D> GetModuleFileName((HMODULE)AfxGetApp()->m_hInstance, app_path,
> > MAX_PATH);
> > D> CString app_str = app_path;
> > D> app_str = app_str.Left(app_str.ReverseFind('\\')+1);
> > D> return app_str;
> > D> }
> > D> El problema es que no entiendo que es eso de CString, alguien me lo
> > podría
> >
> > 'CString' es una clase basada en la plantilla 'CStringT<>', que se
> > define en < cstringt.h>. Ten presente que todo esto no es estándar, ya
> > que forma parte de las MFC, las cuales son propias de Microsoft.
> > Básicamente, 'CString' se parece a la clase estándar 'string' de ANSI C++.
> > Estas clases encapsulan el concepto de una cadena de caracteres que crece
> > dinámicamente y agrupa las funciones básicas para usar y manipular cadenas.
> >
> > D> aclarar? Y por estar más acostumbrado a c que a c++, no se que es eso
> > de
> > D> app_str.left... app_str.ReverseFind('\\')+1)? Todo esto está en la
> > clase
> >
> > La función miembro 'Left()' sirve para obtener una subcadena contando n
> > caracteres desde la izquierda. La función miembro 'ReverseFind()' sirve para
> > encontrar un carácter en una cadena empezando desde atrás hacia al
> > principio.
> >
> > Usando las funciones de ANSI C, lo anterior equivaldría a lo siguiente:
> >
> > char szApp[_MAX_PATH];
> > strncpy( szApp, szRuta, strrchr(szRuta,'\\')-szRuta+1 );
> >
> > Para saber más de éstas y otras funciones en <cstring> (o < string.h>),
> > consulta la referencia en nuestra página yendo a:
> > http://c.conclase.net/librerias/libreria.php?lib=string
> >
> > D> cstring la cual no está en dev c++ no? ( stdafx.h)
> >
> > Bueno, esto ya lo he explicado, pero detallaré un poco más. El fichero
> > de cabecera <string.h> es de ANSI C, pero también tiene el nombre de
> > <cstring> bajo ANSI C++. La clase no estándar 'CString' al igual que la
> > plantilla 'CStringT<>' existen bajo el fichero < cstringt.h>.
> >
> > Por si te interesa, diré que la clase estándar 'string' y la plantilla
> > 'basic_string<>' se definen en el fichero de cabecera <string>.
> >
> > D> Hay alguna forma de no utilizar la mfc?...
> >
> > Dev-C++ no usa MFC, sino el API de MS-Windows, en C. Es posible que
> > exista alguna biblioteca para Mingw32 que implemente las MFC.
> >
> >
> > En cuanto al código que has expuesto, simplemente modifícalo para usar
> > arrays de 'TCHAR'. La función equivalente a 'strrchr()' para cadenas de
> > 'TCHAR' es '_tcsrchr()'. Esto es,
> >
> > TCHAR szApp[_MAX_PATH];
> > TCHAR szRuta[_MAX_PATH];
> >
> > _tcsncpy( szApp, szRuta, _tcsrchr(szRuta,_T('\\'))-szRuta+1 );
> >
> > Estas funciones no estándares se definen en <tchar.h>, que realmente son
> > macros. Tales macros se definen como las funciones 'strrchr()' o
> > 'wcsrchr()'.
> >
> > Por si necesitas saberlo, éste es el prototipo de 'GetFileModuleName()':
> >
> > DWORD GetModuleFileName(
> >   HMODULE hModulo,         // manipulador al módulo
> >   LPTSTR lpNombreFichero,  // array para la ruta
> >   DWORD nCantidad          // tamaño del array
> > );
> >
> > Si 'hModulo' es nulo, entonces tomará el módulo actual. En el código
> > anterior, éste consigue y pasa la instancia de la aplicación como el módulo.
> >
> > El resto del código sirve para eliminar el último carácter '\' de la
> > cadena. Para eso, simplemente sustituye '\\' por el carácter nulo. O sea, el
> > código se reduciría a lo siguiente:
> >
> > *strrchr( szRuta, '\\' ) = 0;
> >
> >
> > Espero que todo esto te ayude.
> >
> > Steven
> > _______________________________________________
> > Lista de correo Cconclase Cconclase en listas.conclase.net
> >
> > http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> > Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> >
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20070316/93ff549e/attachment.html>


Más información sobre la lista de distribución Cconclase