Чтобы определить размер строки в которой будем хранить путь к файлу вызываем функцию
DWORD dwLen = ::SearchPath(NULL, file_name, NULL, 0, NULL, NULL);
Создаем строку с вычисленным размером
TCHAR *path = new TCHAR[dwLen];
Чтобы получить путь к файлу снова вызываем функцию
dwLen = ::SearchPath(NULL, file_name, NULL, dwLen, path, &lpFilePart);
Все это нормально работает в Unicode версии этой функции, но в ANSI если file_name = _T("..\\file.txt"); то функция путь к файлу не копирует и снова возвращает тоже значение как и после первого вызова, чтобы она сработала во втором вызове функции я прибавлял к dwLen 9. Тоже самое происходит если файл находится папке из которой запускается приложение, только в этом случае я к dwLen прибавлял 2.
Проверялось в Windows XP и Windows 2000, не работает.
В Windows 98 работает.