类型的参数与类型错误的参数不兼容[重复]

Posted

技术标签:

【中文标题】类型的参数与类型错误的参数不兼容[重复]【英文标题】:argument of type is incompatible with parameter of type error [duplicate] 【发布时间】:2021-12-18 01:57:09 【问题描述】:
uintptr_t gameModule = (uintptr_t)GetModuleHandle("client.dll");

严重性代码描述项目文件行抑制状态 错误 C2664 'HMODULE GetModuleHandleW(LPCWSTR)':无法将参数 1 从 'const char [11]' 转换为 'LPCWSTR'

【问题讨论】:

大胆猜测,试试GetModuleHandleA函数。 你定义了UNICODE吗?大多数 WinAPI 函数 xyz 实际上是宏并映射到 xyzA(非UNICODE)或 xyzWUNICODE)。您可以:1.取消定义UNICODE,2.直接调用GetModuleHandleA或通过宽字符串L"client.dll"加载。 你不应该转换返回值,顺便说一句,只保留类型HMODULE - 这可以让你在MS决定更改类型的情况下避免麻烦,例如。 G。到一个更复杂的结构(虽然,承认,不太可能......)。 谢谢。最佳解决方案 @aco 你知道 Windows API 引入 ABI 中断的单一事件吗? 【参考方案1】:
uintptr_t gameModule = (uintptr_t)GetModuleHandle("client.dll");

HMODULE GetModuleHandleW(LPCWSTR)':无法将参数 1 从 'const char [11]' 到 'LPCWSTR'

"client.dll" 是一个 char 字符串 (const char [11])。

根据Windows API TCHAR model,GetModuleHandle 是一个预处理器宏,在 Unicode 构建中扩展为 GetModuleHandleW(自 VS 2005 以来 Visual Studio C++ 项目的默认构建模式)。

GetModuleHandleW 需要LPCWSTR 字符串参数,即const wchar_t*,即wchar-t 字符串。

因此,您的GetModuleHandle 调用不匹配,因为您传递了char 字符串,但GetModuleHandle(扩展为GetModuleHandleW)需要wchar_t 字符串(LPCWSTR)。

您可以通过 L"client.dll" 而不是 "client.dll" 来修复此错误;事实上,L"client.dll"(注意 L 前缀)是一个wchar_t 字符串:

// Pass L"client.dll" instead of "client.dll"
uintptr_t gameModule = (uintptr_t)GetModuleHandle(L"client.dll");

另一种选择是显式调用“ANSI”函数GetModuleHandleA

// Explicitly call GetModuleHandleA
uintptr_t gameModule = (uintptr_t)GetModuleHandleA("client.dll");

但我会坚持使用 Unicode API。

您甚至可以完全接受 TCHAR 模型,并用 _T()TEXT() 装饰您的字符串文字,例如:

uintptr_t gameModule = (uintptr_t)GetModuleHandle(_T("client.dll"));

这适用于 ANSI 和 UNICODE 版本。

【讨论】:

从技术上讲,由于GetModuleHandle() 是一个Win32 API 宏,您应该使用Win32 API 的TEXT() 宏而不是C 库的_T() 宏:GetModuleHandle(TEXT("client.dll")) .但是,由于_T()TEXT()通常可互换(因为UNICODE[Win32] 和_UNICODE[C] 通常(未)定义在一起),最终结果是相同的,但我不建议像这样跨越 API 边界。 我一直使用_T(),因为它的打字少且冗长。从实用的角度来看,它们是可以互换的并且都是有效的。

以上是关于类型的参数与类型错误的参数不兼容[重复]的主要内容,如果未能解决你的问题,请参考以下文章

出现此错误时我该怎么办:“int”类型的参数与 C++ 中“int(*)[101]”类型的参数不兼容

“void(*)(int wall)”类型的 C++ 参数与“int”类型的参数不兼容

我有 3 个错误:预期为 ")" ,预期为表达式,long 类型的参数与 U32 类型的参数不兼容

E0167 “CHAR *”类型的参数与“const wchar_t *”类型的参数不兼容

“char *”类型的参数与“LPWSTR”类型的参数不兼容

参数与同一类型的参数不兼容