【问题标题】:Argument Type (WCHAR*) is incompatible with parameter of type "const char*)参数类型 (WCHAR*) 与“const char*”类型的参数不兼容
【发布时间】:2021-08-06 00:24:08
【问题描述】:

这是一些CSGO代码的一部分,我不知道如何解决这个问题;它位于如下所示的 sn-p 的第 8 行:

uintptr_t GetModuleBaseAddress(const char* modName) {
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE) {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry)) {
            do {
                if (!strcmp(modEntry.szModule, modName)) {
                    CloseHandle(hSnap);
                    return (uintptr_t)modEntry.modBaseAddr;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
}

错误信息:

Argument Type (WCHAR*) is incompatible with parameter of type "const char*)

【问题讨论】:

  • 将项目设置更改为多字节而不是 unicode。
  • 阅读TCHAR并使用相应功能; _tcscmp,就你而言。
  • @zdf 但是整个函数(甚至代码库)都必须更改。请注意,给定函数采用 const char* 参数。
  • TCHAR 不是首选方式,十多年来一直没有。不需要再支持Win98了。
  • @DavidHeffernan 我认为TCHAR 用于在比 Windows 98 更新的操作系统上运行的许多实际应用程序中。但我的意思是真正解决评论由 zdf 制作。

标签: c++ winapi wchar


【解决方案1】:

正如 cmets 中所述,您的问题在于您的(新)项目为构建设置了“使用 Unicode 字符集”选项,但(旧)代码库希望使用“使用 Multi-字节字符集”选项。 (前者在 Windows API 调用和结构中使用wchar_t* 类型的字符串,而后者使用char* 类型;这些是不兼容的指针。)

因此,“快速修复”是将项目的构建选项设置为使用“多字节”字符集。在 Visual Studio 2019 中,当您在解决方案资源管理器中右键单击项目时,此选项是项目的 Properties -> Advanced -> Character Set;早期版本的 Visual Studio 在 General 属性选项卡 IIRC 中有选项。

如果您使用的是其他 IDE,那么您需要“手动”取消定义 UNICODE 宏(它向编译器发出“Unicode 字符集”正在使用的信号); #undef UNICODE之前您的系统标题的任何#include <...> 行都可以工作。

对于大部分(大多数)Windows API,这个问题也可以通过使用显式的wchar_tchar 版本的结构和函数来解决;例如,在 cmets 中提到的 GetModuleFileName 函数解析为 GetModuleFileNameWGetModuleFileNameA,具体取决于为构建选择的字符集,并且这些调用中使用的结构有 WA明确定义的版本。因此,可以通过显式使用这些函数和结构的A- 或W- 后缀版本来“覆盖”项目设置的默认调用。

但是,不幸的是,在您的特定情况下,TlHelp32.h 头文件(及其定义的函数)的定义不是很好:没有显式 A-suffixed 版本,所以你不能简单地在你的MODULEENTRY32Module32First 引用后面加上A,就像人们喜欢的那样。 (对于 Unicode 版本,W-suffixed 版本只会覆盖“原始”函数和结构名称,因此这些会丢失到您的代码中。)

因此,无需更改代码以始终使用 TCHAR 类型(TCHAR 解析为 charwchar_t,具体取决于字符集选项),您唯一明智的选择是上述快速修复:更改构建设置。

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2016-05-19
    • 2020-01-20
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多