Sto tentando di utilizzare la chiamata di finestra di dialogo comune GetOpenFileName() per aprire una finestra di dialogo e consentire all'utente di selezionare più file.GetOpenFileName() con OFN_ALLOWMULTISELECT flag impostato
Ho il set di flag OFN_ALLOWMULTISELECT, così come OFN_EXPLORER impostato in modo da ottenere la casella di selezione del file "new style".
Quando ho impostato la mia struttura OPENFILENAME, ho ofn.lpstrFile che punta a un buffer allocato per contenere i risultati e ofn.nMaxFile impostato sulla sua lunghezza.
Il problema che sto avendo è che se l'utente seleziona tanti nomi di file che il buffer sarebbe Overflow, la chiamata a GetOpenFileName restituisce FALSE, e quindi CommDlgExtendedError() restituisce FNERR_BUFFERTOOSMALL.
Questo va bene per il rilevamento degli errori e potrei aumentare le dimensioni del buffer per risolverlo, ma prima o poi l'utente selezionerà un numero sufficiente di nomi di file da sovraccaricare quel buffer.
Ho visto la nota in MSDN che dice che se il buffer è troppo piccolo, i primi due byte del buffer lpstrFile conterranno la dimensione richiesta, ma la dimensione che restituisce sembra troppo piccola (forse questa è corretta quando OFN_ALLOWMULTISELECT non è impostato). Inoltre, questo mi richiederebbe di aprire di nuovo la finestra di dialogo!
Un'altra idea era creare una procedura di hook di dialogo e quindi rilevare la dimensione dei nomi di file quando ottengo un messaggio di notifica CDN_SELCHANGE e allocare dinamicamente un buffer della dimensione corretta, ma mentre scriverà i dati nel nuovo buffer, sembra ricordare il valore originale di ofn.nMaxFile.
Qualcuno conosce il modo corretto di allocare dinamicamente un buffer per contenere i risultati della chiamata GetOpenFile senza che la finestra di dialogo venga visualizzata due volte?
Così, si scopre che l'articolo di Martlark è proprio sul denaro.
I miei 2 errori sono stati:
1) Ho dimenticato di aggiungere MAX_PATH nella dimensione al applcate nel gancio, e
2) Questo funziona solo nella versione unicode di GetOpenFileName. (Stavo compilando UNICODE non definito)
Ho colpito lo stesso identico problema molto tempo fa in passato .. Sto cercando di ricordare come l'abbiamo superato per te! – RobS