I don't see a problem with that code. I tried the following on Windows 98 and it worked fine:

[pascal]function Callback(Window: HWND; List: TStringList): BOOL; stdcall;
var
Buffer: array[0..255] of Char;
begin
SendMessage(Window, WM_GETTEXT, 255, LongInt(@Buffer[0]));
if (Buffer <> '') and IsWindow(Window) and IsWindowVisible(Window) then
begin
List.AddObject(Buffer, TObject(Window));
end;

Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
List: TStringList;
begin
List := TStringList.Create;
try
EnumWindows(@Callback, Integer(List));
ShowMessage('Finished');
Memo1.Lines.Assign(List);
finally
List.Free;
end;
end;[/pascal]