Трюк с GetShortPathName из WinAPI работает нормально, но будьте осторожны при использовании очень длинных путей там.
У нас просто была проблема при вызове 7zip с путями длиннее, чем MAX_PATH. GetShortPathName не работал, если путь был слишком длинным. Просто добавьте префикс «\? \», И тогда он выполнит свою работу и вернет правильно сокращенный путь.