Now that I've had 30 seconds to think about it, neither seem to work.
TApplication doesn't have it's own message loop. TApplication.Run passes control to the current widget set's message loop. Console applications have no widget set, so that does nothing.
And stdin will get closed when the program runs as a daemon. I could do as I originally thought, which is open up a random stream and just read it, but it seems inelegant.
EDIT: My thinking is to start a TThread, have that thread do nothing but TThread.Sleep(TM_FORBLOODYEVER), then have the main program Thread.WaitFor() on it.