This is how I use gluUnproject:
[pascal]
type
T3D_Point = Array[0..2] of gldouble;
function GetWorldPos(X,Y: integer):T3D_Point;
var
viewport: TViewPortArray;
modelview: T16dArray;
projection: T16dArray;
winZ: single;
resPoint: T3D_Point;
begin
glGetDoublev(GL_MODELVIEW_MATRIX,@modelview);
glGetDoublev(GL_PROJECTION_MATRIX,@projection);
glGetIntegerv(GL_VIEWPORT,@viewport);

if(Y = 0) then Y := 1;
glReadPixels(X,round(viewport[3]-Y),1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@winZ);
gluUnProject(X,viewport[3]-Y,winZ,modelview,projection,viewport,@resPoint[0],@resPoint[1],@resPoint[2]);
Result := resPoint;
end;
[/pascal]