With lastItem, everything becomes a lot simpler...:
ShowSelected proc uses ebx esi edi
LOCAL tvi:TVITEM, SmallBuffer[30]:BYTE, BigBuffer[60]:BYTE
lea esi, SmallBuffer
lea edi, BigBuffer
mov tvi.imask, TVIF_TEXT or TVIF_HANDLE
m2m tvi.hItem, lastItem
mov tvi.pszText, esi
mov tvi.cchTextMax, sizeof SmallBuffer
invoke SendMessage, hTVOptions, TVM_GETITEM, 0, addr tvi
mov ecx, len(esi) ; len is Masm32, Len is MasmBasic
mov eax, [esi+ecx-4] ; get the extension
or eax, 20202000h ; make all lowercase
.if eax=="txt." ; .txt
invoke lstrcpy, edi, chr$("problemas\")
invoke lstrcat, edi, esi
invoke ShellExecute, 0, 0, edi, 0, 0, SW_NORMAL
; deb 4, "Txt file", eax, $esi, $edi
.elseif eax=="msa." ; .asm
invoke lstrcpy, edi, chr$("soluciones\")
invoke lstrcat, edi, esi
invoke ShellExecute, 0, 0, edi, 0, 0, SW_NORMAL
; deb 4, "Asm file", eax, $esi, $edi
.elseif eax=="exe." ; .exe
invoke lstrcpy, edi, chr$("ejecutables\")
invoke lstrcat, edi, esi
invoke WinExec, edi, SW_NORMAL
; deb 4, "Exe file", eax, $esi
.else
MsgBox 0, esi, "ERROR: Unknown file", MB_OK
.endif
ret
ShowSelected endp