ちょっと気付いて試してみたらどうやらOKっぽかったので
それのような気がするんですが、

StartDoc() に渡す DOCINFO 構造体って
やっぱ不要なメンバはゼロクリアしとかないとダメです?

マニュアルにはダメとは書いてないんですけど、そんな感じですよね。。。

巷のサンプルみても、初期化せずに必要なメンバ(lpszDocNameとか)設定してる
だけのものが多いんですが違うのかな?

これだけ↓でとりあえずは動くようになったのですが。

 di.cbSize = sizeof(di);
 ZeroMemory(&di, sizeof(di));  // この行を追加
 di.lpszDocName = lpszDocName;
 di.lpszOutput = NULL;