En C "à la main", on définit une chaîne comme ça dans les ressources
STRINGTABLE
BEGIN
519, "Fichier ASCII (*.DAT)\0*.DAT\0Fichier CSV (*.CSV)\0*.CSV\0Fichier JCAMP (*.DX)\0*.DX\0"
END
On a le type .DAT, le .CSV et le .DX qui sont séparés => traités à part chacun.
En C, on fait un LoadString(hInst, 519, (LPSTR)szFiltre, sizeof(szFiltre)) pour charger la ressource dans la chaîne qu'on passe à m_ofn.lpstrFilter.
Au retour, m_ofn.nFilterIndex doit donner l'indice (>= 1 je crois) de l'extension utilisée (1 pour DAT, 2 pour CSV, 3 pour DX dans mon exemple).
Pour le C++, voir el_gringo...