du durchsuchst bei jedem klick den ordner neu, um an die n-te datei zu gelangen!?
das is klarerweise unperformant (und fehleranfällig).
ich würd vorschlagen du lädst entweder alle dateienamen in ein array und schlägst dann den listenindex in diesem array nach, oder du benutzt, was du oben schon fälschlicherweise verwendet hast. nämlich eben genau diese benutzerdefinierten 32 bit werte, die du jedem listenelement zuweisen kannst (LB_GETITEMDATA und LB_SETITEMDATA), und weist damit jedem listenelement einen pointer auf den entsprechenden dateinamen zu.
oder du verwendest eine kombination aus beidem (gibst also z.b. jedem item den index in dem array mit den dateinamen mit).
das alles brauchst du aber sowieso nur, wenn die einträge in deiner liste nicht ohnehin schon die dateinamen sind. wenn dem so ist, dann reicht es, so wie ich es oben beschrieben hab, einfach den text vom selektierten item zu holen und fertig.