[C con Clase] Leer ini ayuda

Steven Davidson steven en conclase.net
Lun Feb 12 03:23:35 CET 2007


Hola Henry,

El pasado 2007-02-12 00:59:41, henry escribió:

h> hola todos, 
h> le quiero pedir una ayuda,
h> he hecho esta funcion pero no se como solucionarla, ya que cuando intento compilarla me devuelve errores.

Veamos el problema.

h> LPCSTR LeerIni(LPCSTR *Seccion ,LPCSTR *Key ,LPCSTR *FileIni ,int *ValorDefecto=-1)
h> {
h> DWORD  res;
h> char Valor[255];
h> res=GetPrivateProfileString(*Seccion,*Key,ValorDefecto,Valor,sizeof(Valor),*FileIni);
h> return (LPCSTR)Valor;
h> }
h> uso LPCSTR , porke quiero usar el DLL en otros lenguajes de programacion,
h> aqui esta alguno de los mensajes de error
h>  cannot convert `int*' to `const CHAR*' for argument `3' to `DWORD GetPrivateProfileStringA(const CHAR*, const CHAR*, const CHAR*, CHAR*, DWORD, const CHAR*)' 

Esdto signfica que estás pasando un valor de tipo 'int *' como 'const char *'. Como no existe un cambio de tipo implícito en el lenguaje, el compilador se queja. Según la documentación, este tercer parámetro es de tipo 'const TCHAR *' y además no puede ser un puntero nulo. Si la función no puede encontrar la cadena a buscar, entonces copiará esta cadena de "defecto" a la cadena de salida - el 4º parámetro.

h> --------------------------------------------------------------------
h>  [Warning] address of local variable `Valor' returned 

Cometerás un error si retornas el array 'Valor' que creaste localmente en la función. Recuerda que todas las variables locales son automáticamente destruidas en cuanto termine el ámbito donde fueron creadas. Por lo tanto, al regresar de la llamada de 'LeerIni()' el array 'Valor' y su contenido serán destruidos e invalidados. Sugiero pasar la cadena del resultado como parámetro a 'LeerIni()'. 

h> ---------------------------
h>  invalid conversion from `char' to `const CHAR*' 

No estoy seguro de la sentencia u operación referida por este mensaje en tu función.


Por último, no veo ninguna necesidad de pasar punteros a las cadenas como parámetros a tu función. Simplemente pasa las cadenas; esto es,

LPCSTR LeerIni( LPCSTR Seccion, LPCSTR Key, LPCSTR FileIni, LPCSTR Valor, int nCant, const char ValorDefecto="" )
{
  ...
  return Valor;
}

Sinceramente, creo que es mejor invocar 'GetPrivateProfileString()' directamente, en lugar de implementar tu propia función. Esto es porque al final, tu función terminará por hacer una sola llamada a la función del API. O sea, quedará algo así,

LPCSTR LeerIni( LPCSTR Seccion, LPCSTR Key, LPCSTR FileIni, LPCSTR Valor, int nCant, const char ValorDefecto="" )
{
  GetPrivateProfileString( Seccion, Key, ValorDefecto, Valor, nCant, FileIni );
  return Valor;
}


Espero haber aclarado la duda.

Steven


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