<div dir="ltr">Hola Salvador,<div><br></div><div>Muy útiles tus consejos, los he probado todos y creo que aunque no me guste tratar con arrays de caracteres (el c# y el tipo string me ha dejado vendido a la hora de pelear con esto sin framework xD) voy a usarlos casi todos.</div>


<div><br></div><div>El tema de usar un doble puntero, básicamente era por desconocimiento de la materia y por mayor comodidad (comodidad mía  fruto de la falta de habito), ya que así no tenía que declarar array de caracteres, pero si lo piensas detenidamente da lo mismo, porque hay que indicar un tamaño de buffer para la cadena, por lo que tienes razón, no merece la pena usar el doble puntero.</div>
<div><br></div><div style>En cuanto al resultado final, te pongo como la he dejado.</div><div style><br></div><div style><div>bool OpenFile(char * szFileName, int nSizeBuffer, char * szFilter, HWND hOwnerWindow)</div><div>
{</div><div>    OPENFILENAME ofn;       // common dialog box structure</div><div><br></div><div>    // Initialize OPENFILENAME</div><div>    ZeroMemory(&ofn, sizeof(ofn));</div><div>    ofn.lStructSize = sizeof(ofn);</div>
<div>    ofn.hwndOwner = hOwnerWindow;       // owner window</div><div>    ofn.lpstrFile = (LPTSTR)szFileName; // Cadena pasada como parámetro</div><div>    //</div><div>    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not</div>
<div>    // use the contents of szFile to initialize itself.</div><div>    //</div><div>    ofn.lpstrFile[0] = '\0';</div><div>    ofn.nMaxFile = nSizeBuffer;         // buffer for file name (szFileName array size)</div>
<div>    ofn.lpstrFilter = szFilter;</div><div>    ofn.nFilterIndex = 1;</div><div>    ofn.lpstrFileTitle = NULL;</div><div>    ofn.nMaxFileTitle = 0;</div><div>    ofn.lpstrInitialDir = NULL;</div><div>    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;</div>
<div><br></div><div>    // Display the Open dialog box.</div><div>    return GetOpenFileName(&ofn);</div><div>}</div><div><br></div></div><div style>Al final paso más de un parámetro, pero es por "universalizar la función", y meterla dentro de un .h que sea usable y entendible facilmente por otra persona que no sea yo (aunque luego este propósito caiga en saco roto, que espero que no xD).</div>
<div style><br></div><div style>He estado apunto de usar el truco que me comentas de inicializar la cadena con el tamaño del array, pero por el motivo que te comento antes lo he dejado que se pase como parámetro, creo que queda mucho más claro (mi opinión xD), de cara a un usuario que sepa programar pero sin que tenga grandes conocimientos de la api</div>
<div style><br></div><div style>Asi que nada, gracias por todo de nuevo, estamos en contacto.</div><div style><br></div><div style>Un saludo.</div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
El 22 de abril de 2013 15:55, Salvador Pozo <span dir="ltr"><<a href="mailto:salvador@conclase.net" target="_blank">salvador@conclase.net</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hola:<br>
<br>
Como siempre que se trabaje con parámetros de tipo puntero, es muy importante prestar atención a posibles desbordamientos y fugas de memoria.<br>
<br>
Lo de la variable estática a mi tampoco me convence, sólo lo mencioné como posible solución, pero tampoco sería mi primera opción.<br>
<br>
En cuanto a cómo has resuelto la función, tengo algunas pegas.<br>
<br>
Por ejemplo, si el valor del puntero a la cadena no va a modificarse, como de hecho así es, no tiene sentido pasar un puntero doble. Puedes usar un puntero sencillo (char*).<br>
<br>
Si se asume que el tamaño de la cadena pasada como parámetro es lo bastante grande, puedes eliminar la variable local szFile:<br>
<br>
----8<------<br>
<br>
    char nombre[256];<br>
<br>
    OpenFile((char*)nombre);<br>
...<br>
<br>
bool OpenFile(char * szFileName, int nSizeBuffer )<br>
<div class="im">{<br>
    OPENFILENAME ofn;       // common dialog box structure<br>
</div><div class="im">    HWND hwnd = NULL;       // owner window<br>
<br>
</div><div class="im">    // Initialize OPENFILENAME<br>
    ZeroMemory(&ofn, sizeof(ofn));<br>
    ofn.lStructSize = sizeof(ofn);<br>
    ofn.hwndOwner = hwnd;<br>
</div>    ofn.lpstrFile = (LPTSTR)szFileName; // Cadena pasada como parámetro<br>
<div class="im">    //<br>
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not<br>
    // use the contents of szFile to initialize itself.<br>
    //<br>
    ofn.lpstrFile[0] = '\0';<br>
</div>    ofn.nMaxFile = nSizeBuffer;  // Tamaño indicado en parámetro<br>
<div class="im">    ofn.lpstrFilter = "Text\0*.TXT\0All\0*.*\0";<br>
    ofn.nFilterIndex = 1;<br>
    ofn.lpstrFileTitle = NULL;<br>
    ofn.nMaxFileTitle = 0;<br>
    ofn.lpstrInitialDir = NULL;<br>
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;<br>
<br>
    // Display the Open dialog box.<br>
<br>
    if (GetOpenFileName(&ofn)==TRUE)<br>
    {<br>
</div><div class="im">        return true;<br>
    }<br>
    else<br>
    {<br>
        return false;<br>
    }<br>
}<br>
</div>----8<------<br>
<br>
Para evitar el segundo parámetro hay un pequeño truco que a veces se usa también en el API, y es pasar la longitud de la cadena como primer valor de la propia cadena:<br>
<br>
----8<------<br>
char nombre[256];<br>
*(int*)nombre = 256;<br>
<br>
<br>
...<br>
<br>
bool OpenFile(char * szFileName )<br>
<div class="im">{<br>
    OPENFILENAME ofn;       // common dialog box structure<br>
</div><div class="im">    HWND hwnd = NULL;       // owner window<br>
<br>
</div><div class="im">    // Initialize OPENFILENAME<br>
    ZeroMemory(&ofn, sizeof(ofn));<br>
    ofn.lStructSize = sizeof(ofn);<br>
    ofn.hwndOwner = hwnd;<br>
</div>    ofn.lpstrFile = (LPTSTR)szFileName;<br>
    ofn.nMaxFile = *(int*)szFileName; // Longitud del buffer<br>
<div class="im">    //<br>
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not<br>
    // use the contents of szFile to initialize itself.<br>
    //<br>
    ofn.lpstrFile[0] = '\0';<br>
</div><div class="im">    ofn.lpstrFilter = "Text\0*.TXT\0All\0*.*\0";<br>
    ofn.nFilterIndex = 1;<br>
    ofn.lpstrFileTitle = NULL;<br>
    ofn.nMaxFileTitle = 0;<br>
    ofn.lpstrInitialDir = NULL;<br>
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;<br>
<br>
    // Display the Open dialog box.<br>
<br>
    if (GetOpenFileName(&ofn)==TRUE)<br>
    {<br>
</div><div class="im">        return true;<br>
    }<br>
    else<br>
    {<br>
        return false;<br>
    }<br>
}<br>
</div>----8<------<br>
<br>
En cuanto a lo de dejar el tamaño del buffer como fijo creo que no tienes muchas opciones, la función GetOpenFileName retornará false si no hay espacio suficiente para almacenar el nombre del fichero, de modo que tienes que asegurarte de que el tamaño sea lo bastante grande antes de llamar a la función.<br>

<div class="HOEnZb"><div class="h5"><br>
Hasta pronto.<br>
<br>
--<br>
Salvador Pozo (Administrador)<br>
mailto:<a href="mailto:salvador@conclase.net">salvador@conclase.net</a><br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br></div>