[C con Clase] common dialog y punteros.

Hugo García hgc2204 en gmail.com
Lun Abr 22 13:34:58 CEST 2013


Hola,

Solo quería darte las gracias y comentar como curiosidad, que la asignación
efectivamente solo tiene sentido dentro de la función, en el momento que se
termina esa pierde.

He probado lo de la variable estática  pero no me termina de convencer ese
sistema xD. El método 2 sería estupendo, pero no entiendo porque no me deja
asignar un puntero a un char en lugar del array :S.

Así que la decisión final que he tomado ha sido esta usar la función strcpy:

bool OpenFile(char ** szFileName, int nSizeBuffer )
{
    OPENFILENAME ofn;       // common dialog box structure
    char szFile[nSizeBuffer];       // buffer for file name
    HWND hwnd = NULL;       // owner window
    HANDLE hf;              // file handle

    // Initialize OPENFILENAME
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    //
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
    // use the contents of szFile to initialize itself.
    //
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = "Text\0*.TXT\0All\0*.*\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

    // Display the Open dialog box.

    if (GetOpenFileName(&ofn)==TRUE)
    {
        strcpy(*szFileName,szFile);
        return true;
    }
    else
    {
        return false;
    }
}

No me termina de convencer lo de pasar el tamaño del array como variable,
pero es que la anterior opción que tome (usar librerias de c++ y devolver
un tipo string) tampoco me convence, porque además tengo que dejar el bufer
(el tamaño del array que contendrá la dirección) fijo, y es una solución
que tampoco me gusta xD.


El 19 de abril de 2013 16:53, Salvador Pozo <salvador en conclase.net>escribió:

> 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
> _______________________________________________
> 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/20130422/147866e1/attachment.html>


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