The perhaps most interesting thing (which you did wrong as well) is, that you MUST NOT use StartServiceCtrlDispatcher(). Actually this function does nothing more than passing the dispatcher function address to the SCM. The SCM calls it and the service EXE is no more than a "quasi-
DLL" of the SCM from this point.
So this was your first mistake. You don't need to call this function because it is only needed if your service was located in an EXE file!
... to be continued ...