[C con Clase] common dialog y punteros.

Hugo García hgc2204 en gmail.com
Vie Abr 19 10:34:00 CEST 2013


Hola a todos,

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

Adjunto el proyecto en el que tengo el problema en cuestión, no obstante
procedo a explicarlo con algunas capturas de pantalla para facilitar la
comprensión de lo que quiero preguntar.

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

Esta es la documentación que he seguido (junto al curso de winapi
porsupuesto).

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspx

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

Inicialmente había creado la función OpenFile de la siguiente manera (que
tampoco entiendo porque no funciona...):

void OpenFile(char ** szFileName)
{
    OPENFILENAME ofn;       // common dialog box structure
    char szFile[256];       // 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)
    {
        hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
            0, (LPSECURITY_ATTRIBUTES) NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
            (HANDLE) NULL);
        *szFileName = szFile;
        MessageBox(NULL, *szFileName, "Mensaje de menú", MB_ICONEXCLAMATION
| MB_OK);
    }
}

y la llamaba de la siguiente manera:

case CM_OPEN:
                    OpenFile(&szFile);
                    cout << "la cadena vale" << szFile << endl;
                    break;

El resultado que obtenía era este:

[image: Imágenes integradas 1]

En la alerta que hay en la función la ruta que buscaba se muestra
correctamente, pero cuando volvemos al main el resultado es bien distinto...

[image: Imágenes integradas 2]


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

[image: Imágenes integradas 3]

Y no entiendo porque así si, y de la manera original que debe ser la
correcta para hacer un programa escrito puramente en c no funciona...

Bueno, espero haber sabido transmitir mi problema y que alguien me pueda
responder.

Un saludo.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130419/3319045c/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 76867 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130419/3319045c/attachment.png>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 41508 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130419/3319045c/attachment-0001.png>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 31868 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130419/3319045c/attachment-0002.png>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: functions.h
Type: text/x-chdr
Size: 2187 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130419/3319045c/attachment.bin>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: ids.h
Type: text/x-chdr
Size: 161 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130419/3319045c/attachment-0001.bin>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: main.cpp
Type: text/x-c++src
Size: 4490 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130419/3319045c/attachment-0002.bin>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: resources.rc
Type: application/octet-stream
Size: 327 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130419/3319045c/attachment.obj>


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