1.sizeof(fullpath) → sizeof fullpath / sizeof *fullpath
2._tcsrchr(fullpath, '\\')→ _T('\\')
3._tcsrchr(fullpath, '\\') _UNICDEかMBCSが定義されてないとShift-JISは問題起こす(たぶん)
4.dest[0] = '\0'→_T('\0')
5.return -1→return static_cast<size_t>(-1)とか

↓ これで我慢しろ。(UNCパスだと問題あるかも)
std::basic_string<TCHAR> getExePath()
{
TCHAR exe_path[MAX_PATH];
DWORD r = ::GetModuleFileName(NULL, exe_path, sizeof exe_path / sizeof *exe_path);
if( r == 0 || r == sizeof exe_path / sizeof *exe_path )
throw std::runtime_error("うぎゃあ");

TCHAR drive[_MAX_DRIVE], path[_MAX_PATH];
_tsplitpath(exe_path, drive, path, NULL, NULL);

return std::basic_string<TCHAR>(drive) + path;
}