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

Steven Davidson steven en conclase.net
Jue Mar 15 06:11:59 CET 2007


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


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