0

我在 C++ 中有 GetShortPathNameW 和 MSVC 2008 免费版。我只想使用它,以便它可以搜索或返回不带 .exe 扩展名的文件名。有人可以帮助我吗?代码如下:

WCHAR buffer[MAX_PATH];
    LPCWSTR dataFilePath = wArgv[datafile_argv];

        // Hack for Windows in case there are unicode chars in the path.
    // The normal argv[] array has ????? instead of the unicode chars
    // and fails, so instead we manually get the short file name, which
    // is always using ANSI chars.
    if (wcschr(dataFilePath, '\\') == NULL)
    {
        GetCurrentDirectoryW(MAX_PATH, buffer);
        wcscat(buffer, L"\\");
        wcscat(buffer, dataFilePath);
        dataFilePath = &buffer[0];

    }

    if (GetShortPathNameW(dataFilePath, directoryPathBuffer, MAX_PATH) == 0)
    {
        platform->DisplayAlert("Unable to determine startup path: GetShortPathNameW failed.");
        game_file_name = NULL;
        return;
    }
4

1 回答 1

3

我只想使用它,以便它可以搜索或返回不带 .exe 扩展名的文件名。

当然,只需使用该PathRemoveExtension功能。您只需向它传递一个包含字符串的长度缓冲区MAX_PATH,然后它就地剥离扩展名(如果存在)。

std::wstring path(MAX_PATH, L'\0');
if (!GetCurrentDirectoryW(MAX_PATH, &path[0]))
{
    throw std::runtime_error("The GetCurrentDirectory function failed");
}
PathRemoveExtension(&path[0]);

我会推荐使用PathCombinePathAppend来连接路径元素,而不是 C 风格的字符串操作函数。这些函数旨在使用路径,并为您自动添加反斜杠(或任何其他路径分隔符)。


但我真的不明白你在问题中发布的代码,从评论开始:

// Hack for Windows in case there are unicode chars in the path.
// The normal argv[] array has ????? instead of the unicode chars
// and fails, so instead we manually get the short file name, which
// is always using ANSI chars.

也许更简单的解释方式是标准argv[]数组,作为参数传递给 C 程序的入口点,必须是类型为 的数组char。在 Windows 上,这意味着它不支持 Unicode 字符。对 Unicode 的支持要求您使用wchar_t(或等效的宏之一)。

您可以在 Windows 中专门解决此问题,方法是使用wmain作为入口点,而不是main. 对于这个函数,argv[]是一个宽字符数组 ( wchar_t)。我假设您正在为多个操作系统交叉编译代码,在这种情况下,您需要使用一些预处理器魔法来确保在针对 Windows 时获得正确的入口点。

如果你绝对不能这样做,那么只需调用GetCommandLineandCommandLineToArgv函数来检索命令行参数,然后将它们转换为argv[]包含宽字符的样式数组。

作为替代方案,您可以按照 Alf 的建议执行并调用该GetModuleFileName函数,NULL作为第一个参数传递,以检索可执行文件的路径。

无论您采用哪种方法,重要的是要意识到转换短路径是一种非常丑陋的黑客攻击,如果底层文件系统禁用了短名称,它实际上会受到破坏。由于您的代码在任何地方都使用 Unicode API,因此只要您首先获得有效的路径字符串,处理路径中的 Unicode 字符应该没有问题。

于 2013-04-08T21:28:54.153 回答