I'm thinking of doing it this way:

1) Use gluUnproject to transform window coordinates (winx, winy, winz) to object coordinates (objx, objy, objz). Use it twice: once with winx = 0.0 for near plane; and once with winz = 1.0 for far plane. Subtract these two points from each other to retrieve a ray vector.

2) Use the ray vector to test for intersection with each selectable object in your frustum. There are plenty of sources for intersection algorithms on the net and in books. Use the nearest intersection (i.e. the closest object) for your selection.

I haven't tried it yet, though. Maybe I'll try it tomorrow and post some code here. It looks interesting enough to warrant the effort.