首页 > 解决方案 > 类型的参数与类型错误的参数不兼容

问题描述

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

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

标签: c++winapitextwchar-t

解决方案


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 模型GetModuleHandle是一个预处理器宏,它GetModuleHandleW在 Unicode 构建中扩展(自 VS 2005 以来 Visual Studio C++ 项目的默认构建模式)。

GetModuleHandleW需要一个LPCWSTR字符串参数,即 a 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()or装饰你的字符串文字TEXT(),例如:

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

这适用于 ANSI 和 UNICODE 版本。


推荐阅读