I know your pain. Several years ago, I ended up reading the source for logrotate, and ported it to Windows (translating from C to Perl in the process -- yes, I'm a glutton for punishment).
The main problem with Windows log-rotation is file-locking. If a file is open during the rotation, it can't be moved, renamed etc. I got around this, by deciding that for my application, the rotation was more important than a few missed log-lines and simply doing a copy, then truncate (though, I'm sure that there was more to it than that, unfortunately I don't have the source readily available). In any case, it turned out that the operation was so quick, that I very much doubt that we've lost more than a couple of lines in the history of its usage.
This is, I believe, why native Windows applications generally do their own log-rotation -- the application itself holds the locks and can cache the log-messages while the rotation occurs, for later flushing.