Un piccolo suggerimento.
Dato che stai forzando l'uso specifico di atd::string e LPSTR, dovresti invocare FormatMessageA, altrimenti se le macro per unicode sono impostate, FormatMessage diventa FormatMessageW con tutti gli errori del caso.