[C con Clase] common dialog y punteros.

Salvador Pozo salvador en conclase.net
Vie Abr 19 16:53:44 CEST 2013


El pasado 2013-04-19 08:33:56, Hugo García escribió:
 
HG> Hola a todos,

Hola:

HG> Lo primero de todo pedir disculpas si hago algo mal (me expreso mal), es la
HG> primera vez que consulto una duda en Internet y la primera vez que recurro
HG> a una lista de correo.

No hay de qué. La verdad es que, al menos yo, prefiero consultas en las que se incluyan muchos detalles, ya que ayuda a orientar mejor las respuestas.

HG> La cosa es que tal cual está ahora el proyecto, funciona y no da ningún
HG> problema... (quitando el que no puedo pasar un string como parametro a la
HG> función mensajebox, pero eso es otro asunto a tratar) y me gustaría saber
HG> el por que.

El problema es que estás retornando un puntero a una variable local de la función OpenFile. Un puntero a szFile sólo tiene sentido dentro de la función, y la cadena deja de existir en el momento que se abandona esa función. Por eso el valor retornado contiene "basura".

A mi modo de ver, además de la solución que has usado que no sé cual es, tienes dos opciones para que esta función devuelve la cadena correctamente:
1) Hacer que szFile sea estática, de este modo la memoria asignada a esa cadena existirá siempre a lo largo de la vida de la aplicación.
2) Que el puntero a la cadena que pases apunte a una cadena válida, y en lugar de usar szFile, usar la cadena que pasas como parámetro en la estructura ofn.
 
void OpenFile(char ** szFileName)
{
    OPENFILENAME ofn;       // common dialog box structure
...
     ofn.lpstrFile = *szFileName;
...

HG> La cosa es que tras hacer la pequeña modificación (que actualmente es como
HG> está el proyecto) de hacer que la función OpenFile te devuelva un string en
HG> lugar de pasar una cadena por referencia me muestra el resultado
HG> correctamente...

No te puedo decir por qué así funciona, puesto que no sé en qué consiste esa "pequeña modificación".

HG> Se que indica que a partir de vista es recomendable usar el control common
HG> item dialog, pero es que sin un ejemplo "mascadito como el otro" soy
HG> incapaz de hacer algo... lo mismo es por no usar el control adecuado que no
HG> funciona... no lo se...

No tiene nada que ver, el API, salvo que se indique lo contrario en la documentación, siempre mantiene la compatibilidad hacia atrás. El método que usas debe funcionar tanto en Windows 8, 7 o Vista, como en XP y 2000. El que propone la documentación sólo funciona a partir de Windows Vista.

No te prometo nada, ya que no sé si tendré tiempo, pero intentaré hacer algún ejemplo que use el "common item dialog".

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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