win32 MapAndLoad 当我使用带有特殊字符的路径时不起作用

问题描述 投票:0回答:1

当我想将

MapAndLoad()
与包含特殊字符(如
ł
)的路径一起使用时,我遇到了问题,它不起作用。我读到它需要 ASCII 字符,那么当我的路径有非 ASCII 字符时如何调用这个函数?

std::string path = "C:\\Users\\user\\łał\\lib\\native.dll";

if (!MapAndLoad(path.c_str(), nullptr, &LoadedImage, TRUE, TRUE)) {
    fmt_println("MapAndLoad failed");
    return;
}

ImageExportDirectory = (_IMAGE_EXPORT_DIRECTORY *)
    ImageDirectoryEntryToData(LoadedImage.MappedAddress,
                              false,
                              IMAGE_DIRECTORY_ENTRY_EXPORT, &cDirSize);
if (ImageExportDirectory == nullptr) {
    fmt_println("ImageExportDirectory == nullptr");
    return;
}

dNameRVAs = (DWORD *) ImageRvaToVa(LoadedImage.FileHeader,
                                   LoadedImage.MappedAddress,
                                   ImageExportDirectory->AddressOfNames, nullptr);
for (size_t i = 0; i < ImageExportDirectory->NumberOfNames; i++) {
    sName = (char *) ImageRvaToVa(LoadedImage.FileHeader,
                                  LoadedImage.MappedAddress,
                                  dNameRVAs[i], nullptr);
    fmt_println("{}", sName);
}

UnMapAndLoad(&LoadedImage);

我尝试使用迭代目录的代码:

WIN32_FIND_DATAA findData;
HANDLE hFind = FindFirstFileA((path + "\\*").c_str(), &findData);
if (hFind != INVALID_HANDLE_VALUE) {
    do {
        if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            fmt_println("dir: {}", findData.cFileName);

            //print as hex
            for (int i = 0; i < strlen(findData.cFileName); ++i) {
                fmt_println("{}", (int) findData.cFileName[i]);
            }
            fmt_println("--------------");
        } else {
//          fmt_println("file: {}", findData.cFileName);
        }
    } while (FindNextFileA(hFind, &findData));
    FindClose(hFind);
}

这是输出:

dir: łał ffffffc5ffffff8261ffffffc5ffffff82
-59
-126
97
-59
-126
c++ winapi
1个回答
0
投票

MapAndLoad
是一个旧版 ANSI API,可使用编码为 代码页编码的字符串。

您可以尝试为 ANSI API 选择 UTF-8 作为解决方法。您必须创建一个应用程序清单才能执行此操作。

只需在您的应用程序 exe 文件附近创建一个

<appName>.manifest

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
  <assemblyIdentity name="Organization.Division.Name" version="6.0.0.0" />
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings"> 
      <activeCodePage>UTF-8</activeCodePage> 
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

更多信息: https://learn.microsoft.com/en-us/windows/apps/design/globalizing/use-utf8-code-page https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests#activeCodePage

© www.soinside.com 2019 - 2024. All rights reserved.