2009-03-18 3 views
5

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)

+0

Ho colpito lo stesso identico problema molto tempo fa in passato .. Sto cercando di ricordare come l'abbiamo superato per te! – RobS

risposta

4

Un problema interessante. Immagino che potresti semplicemente allocare tutta la memoria; nel caso in cui! Ma questo documento suggerisce di utilizzare un proc Hook:

http://support.microsoft.com/kb/131462

E tutto in delightfull comprensibile OO C non!

+0

Questo articolo suggerisce una soluzione che è quasi esattamente la stessa del hook di dialogo che ho provato. Forse dovrei controllare il mio codice per assicurarmi che non stia facendo niente di stupido! - Grazie mille per averlo trovato, il mio google-fu era debole. –

+0

Fai attenzione a un bug quando restituisci solo un nome di file a cui viene suggerito. PS: usato Live Search – Martlark