当我想将
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
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