类型的参数与类型错误的参数不兼容[重复]
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
)或 xyzW
(UNICODE
)。您可以: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 *”类型的参数不兼容